如何获取 &dyn 特征背后的变量类型?

How do I get the type of a variable behind a &dyn Trait?

提问人:Rahn 提问时间:11/9/2023 最后编辑:Rahn 更新时间:11/9/2023 访问量:49

问:

在下面的示例中,我尝试打印出变量和(都具有类型和implements trait)的类型。xyFooFooBar

但是当传递到一个函数中时,被传递为但传递为,我从和那里得到了不同的类型名称:print_name()x&Fooy&dyn Barxy

x: &rust_test::Foo
y: &dyn rust_test::Bar

如何修复此程序以在将变量传递到函数中时获得一个?Foo&dyn Bar

完整代码:

use std::any::type_name;

fn type_of<T: ?Sized>(_: &T) -> String {
    type_name::<T>().to_string()
}

struct Foo {}

trait Bar {}

impl Bar for Foo {}

fn print_name(x: &Foo, y: &dyn Bar) {
    println!("x: {}", type_of(&x));
    println!("y: {}", type_of(&y));
}

fn main() {
    let x = Foo {};
    let y = Foo {};

    print_name(&x, &y);
    /*
    x: &rust_test::Foo
    y: &dyn rust_test::Bar
    */
}
锈病 类型性状

评论

2赞 Chayim Friedman 11/9/2023
std::any::type_name()仅用于调试目的。你真的需要它吗?
0赞 Rahn 11/9/2023
@ChayimFriedman 有没有更好的方法来获取变量的类型(最好是字符串)?
2赞 Chayim Friedman 11/9/2023
出于什么目的?你能用它做什么?
1赞 Chayim Friedman 11/9/2023
你不能依赖它来做到这一点。为此,您需要 TypeId(不过,它也有同样的问题)。type_name()
1赞 cafce25 11/9/2023
您必须像此 Q/A 中所示向 trait 添加方法,但您实际上不必通过 ,您可以直接公开而不是间接通过 。Anytype_idas_any

答: 暂无答案