gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:35:26 25 4
gpt4 key购买 nike

我有一份传感器规范 list 。每种传感器类型都有一个伴随的结构。传感器规范有一个传感器类型和一个键,数据可以作为字符串从数据库中获取。

根据传感器类型,数据应转换为数值,可能是 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. Match arm 有不兼容的类型。

这是#2 的编译信息:

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

我该如何解决这个问题?

最佳答案

我会将您的 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()
}
}

关于rust - 将字符串解析为不同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com