将字符串解析为不同的类型

时间:2015-07-21 23:27:27

标签: rust type-systems

我有一份传感器规格清单。每种传感器类型都有一个附带的结构传感器规范具有传感器类型和密钥,使用该密钥可以将数据作为字符串从数据库中提取。

根据传感器类型,数据应转换为数值,可能类似于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. 匹配手臂具有不兼容的类型。
  3. 这里是#2的编译消息:

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

    我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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()
    }
}