2015-07-21 90 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。或换句话说:你得到的错误信息不是关于匹配本身,而是关于应该从中返回什么,因为手臂返回不同的类型。 –