如何在Rust中匹配数据类型?

如何在Rust中匹配数据类型?,rust,Rust,我试图匹配结构的泛型字段的数据类型,并做出相应的反应。我的总体想法是这样的(代码不编译): 我想要的是x与第一个匹配。实际上,我不确定我想做什么可以做到,但什么能达到预期的效果呢?惯用解决方案 在Foo中创建一个约束参数T的特征,将任何特定行为作为该特征的关联函数来实现 例如: trait PrintMe { fn print_me(&self); } impl PrintMe for String { fn print_me(&self) { println!

我试图匹配结构的泛型字段的数据类型,并做出相应的反应。我的总体想法是这样的(代码不编译):


我想要的是
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将
CamelCase
用于结构、枚举和特征。您应该使用
Foo
。谢谢您,Matthieu。这就把事情弄清楚了。总的来说,我认为我需要改变我的设计,我一直在用“C风格”设计我的代码。谢谢+1表示“不要那样做”,我只想指出Rust有
enum
,这是编写所有
TypeId::of
检查的更好(更短、更清晰、惯用且编译时已检查)方法。@trentcl:这取决于
enum
表示封闭多态性,
trait
表示开放多态性。。。“如果这有道理的话。”马蒂厄姆说。这是有道理的。不过,您已经提到了特性,所以我想我应该指出另一种解决方案
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();
}
fn print_me<T>(x: &Foo<T>) {
    if TypeId::of::<T>() == TypeId::of::<String>() {
        println!("I am a string");
    } else // ...
}