我是Rust的新手。
如何在Rust中实现与下面相同的功能?
// C++ code
variant<string, int, float> value;
更新
我正在创建一个生锈的扫描仪(lexer,如果你喜欢的话(。我想为每个Token结构存储一个不同的文本(可能是字符串、整数等(。
在不知道具体需求的情况下,实现这一点的最自然的方法是使用枚举。Rust枚举构造可以具有与各种类型匹配的成员。请参阅Rust书的这一章,了解如何定义枚举,然后如何解构(模式匹配(枚举以获取内部数据:https://doc.rust-lang.org/book/ch06-00-enums.html
enum Value {
Msg(String),
Count(u32),
Temperature(f32),
}
pub fn value_test() {
let value = Value::Count(7);
// the type is Value, so it could be Value::Count(_), Value::Temperature(_),
// or Value::Msg(_), or you could even add a Value::Empty definition
// that has nothing inside. Or a struct-type with member variables.
if let Value::Msg(inner_str) = value {
println!("This will not run: {}", inner_str);
}
}
我想重申@piojo关于使用enums的说法,还包括一个关于如何在rust代码中使用变体的巧妙示例。
enum Action{
Speak(String),
Quit,
RunFunc(i32, i32, fn(i32,i32)->i32),
}
fn act(action: &Action) {
match action {
Action::Speak(value) => {
println!("Asked to speak: {value}");
},
Action::Quit => {
println!("Asked to quit!");
},
Action::RunFunc(v1, v2, func) => {
let res = func(*v1, *v2);
println!("v1 : {v1}, v2: {v2}, res: {res}");
}
}
}
fn main(){
let action = Action::Speak(String::from("Hello"));
let action2 = Action::Quit;
fn add(v1:i32, v2:i32)->i32{
v1 + v2
}
let action3 = Action::RunFunc(5, 6, add);
act(&action);
act(&action2);
act(&action3)
}
输出:
Asked to speak: Hello
Asked to quit!
v1 : 5, v2: 6, res: 11