我正在尝试匹配结构的通用字段的数据类型并做出相应的 react 。我的总体想法是这样的(代码无法编译):
struct Foo<T> {
bar: T,
}
fn main() {
let x = Foo::<String> {
bar: "world".to_string(),
};
match x.bar {
String => println!("It's a string!"),
u32 => println!("It's a u32!"),
_ => println!("Something else"),
};
println!("end of program!");
}
编译器的错误信息:
warning: unreachable pattern
--> src/main.rs:12:9
|
11 | String => println!("It's a string!"),
| ------ matches any value
12 | u32 => println!("It's a u32!"),
| ^^^ unreachable pattern
|
= note: `#[warn(unreachable_patterns)]` on by default
warning: unreachable pattern
--> src/main.rs:13:9
|
11 | String => println!("It's a string!"),
| ------ matches any value
12 | u32 => println!("It's a u32!"),
13 | _ => println!("Something else"),
| ^ unreachable pattern
warning: unused variable: `String`
--> src/main.rs:11:9
|
11 | String => println!("It's a string!"),
| ^^^^^^ help: consider prefixing with an underscore: `_String`
|
= note: `#[warn(unused_variables)]` on by default
warning: unused variable: `u32`
--> src/main.rs:12:9
|
12 | u32 => println!("It's a u32!"),
| ^^^ help: consider prefixing with an underscore: `_u32`
warning: variable `String` should have a snake case name
--> src/main.rs:11:9
|
11 | String => println!("It's a string!"),
| ^^^^^^ help: convert the identifier to snake case: `string`
|
= note: `#[warn(non_snake_case)]` on by default
我想要的是 x
匹配第一个。我其实并不确定我想做的事能不能做,但怎样才能达到预期的效果呢?
最佳答案
惯用的解决方案
在 Foo
中创建一个约束参数 T
的特征,将任何特定行为实现为该特征的关联函数。
例子:
trait PrintMe {
fn print_me(&self);
}
impl PrintMe for String {
fn print_me(&self) { println!("I am a string"); }
}
struct Foo<T: PrintMe> {
bar: T
}
fn main() {
// ...
x.bar.print_me();
}
这是有原则的泛型编程,您可以在其中准确声明可能的泛型参数的行为差异,因此不会出现意外。
另见:
精确解
Rust 确实可以查询类型:每种类型都有一个唯一的 TypeId
关联,您可以通过一系列 if
检查来匹配 TypeId
。它很笨重。
fn print_me<T>(x: &Foo<T>) {
if TypeId::of::<T>() == TypeId::of::<String>() {
println!("I am a string");
} else // ...
}
但是请...不要那样做:)
关于rust - 如何匹配 Rust 中的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41596628/