2015-07-21 91 views
-1

我有一個傳感器規格列表。每種傳感器類型都有一個伴隨結構。傳感器規格有一個傳感器類型和一個鍵,數據可以作爲字符串從數據庫中獲取。解析不同類型的字符串

根據傳感器類型的不同,數據應該轉換爲數值,可以是u8或f64。

下面是一個例子:

use std::collections::HashMap; 

struct SensorSpec { 
    sensor_type: SensorType, 
    data_key: String, 
} 

enum SensorType { 
    A, 
    B, 
} 

#[derive(Debug)] 
struct SensorA { 
    value: u8, 
} 

#[derive(Debug)] 
struct SensorB { 
    value: f64, 
} 

fn main() { 

    // This simulates the database 
    let mut db: HashMap<String, String> = HashMap::new(); 
    db.insert("a".to_string(), "42".to_string()); 
    db.insert("b".to_string(), "13.37".to_string()); 

    // List of sensors 
    let mut sensor_specs: Vec<SensorSpec> = vec![ 
     SensorSpec { sensor_type: SensorType::A, data_key: "a".to_string() }, 
     SensorSpec { sensor_type: SensorType::B, data_key: "b".to_string() }, 
    ]; 

    for sensor in sensor_specs { 
     // 1. Fetch data as string from db 
     // 2. Convert it according to the sensor type 
     // 3. Print sensor object to terminal 

     let val = db.get(&sensor.data_key); 

     let s = match sensor.sensor_type { 
      SensorType::A => { 
       SensorA { value: val } 
      }, 
      SensorType::B => { 
       SensorB { value: val } 
      }, 
     }; 

     println!("{:?}", s); 
    } 

} 

有兩個問題:

  1. 我需要將字符串轉換爲根據傳感器類型數字類型。我怎麼做?
  2. 匹配手臂具有不兼容的類型。

以下是編譯消息#2:

example.rs:43:17: 50:10 error: match arms have incompatible types: 
expected `SensorA`, 
    found `SensorB` 

我怎樣才能解決這個問題呢?

+0

請詢問[每個問題只有一個問題](http://meta.stackexchange.com/q/39223/281829)。 – Shepmaster

+0

@Shepmaster這兩個問題是直接相關的。我知道如何轉換類型,但在兩個比賽武器的情況下,它不起作用。所以沒有理由爲downvote。 –

回答

1

我會用下面的更換你的SensorType枚舉:

enum Sensor { 
    A(SensorA), 
    B(SensorB) 
} 

這樣做的好處是,你可以把Sensor兩類在同一個容器:

let sensorA = ...; 
let sensorB = ...; 
let mut vec = vec!(Sensor::A(sensorA), Sensor::B(sensorB)); 

或寫信給你自己的功能,預計任一類Sensor

fn use_sensor(sensor: &Sensor) { 
    match sensor { 
     Sensor::A(sensorA) => sensorA.foo(), 
     Sensor::B(sensorB) => sensorB.bar() 
    } 
} 
+0

@Shepmaster:恩,好吧,你想要什麼?關於代數數據類型的全稱是什麼? – pyon

+0

不,但顯示*如何使用枚舉*將是一個好的開始。你的例子沒有顯示枚舉如何修復「匹配手臂有不兼容類型」的錯誤。 – Shepmaster

+0

您需要考慮的問題@Shepmaster是代碼中的「什麼類型的s」。它不能既是SensorA也是SensorB,但在EduardoLeón代碼中,它可以是Sensor。或換句話說:你得到的錯誤信息不是關於匹配本身,而是關於應該從中返回什麼,因爲手臂返回不同的類型。 –