【问题标题】:Implement function for trait implementor with dynamic and static dispatch使用动态和静态分派为 trait 实现者实现功能
【发布时间】:2017-01-23 17:36:35
【问题描述】:

我想要一个函数foo 获取一个实现特征A 的类型的实例。我总是更喜欢使用泛型来进行静态调度:

trait A {}

fn foo<T: A>(t: T) {}

但是,这种方法引入了一些不灵活,我不能像这里一样传递 trait 对象:

trait A {}

fn foo(t: &A) {}

问题是,有时我知道类型,有时不知道。有没有一种方法可以同时对 trait 对象进行动态分派和对编译时已知类型进行静态分派,同时不实现两次?

【问题讨论】:

    标签: generics rust


    【解决方案1】:

    这确实是可能的。一种选择是为其引用类型显式实现A

    impl<'a, T: A + ?Sized> A for &'a T {}
    

    T = &amp;A 时,该参数成为一个特征对象,同时仍为A 的已知实现者进行静态调度。现在应该可以编译以下代码:

    fn foo<T: A>(a: T) {}
    
    struct MyA;
    impl A for MyA {}
    
    fn main() {
        foo(MyA{});
        foo(&MyA{});
        foo(&MyA{} as &A);
    }
    

    如果你愿意总是传递借用的参数,你也可以这样做:

    fn foo<T: A + ?Sized>(a: &T) {}
    

    T = A 时,参数成为一个特征对象。

    【讨论】:

    • 我不确定我是否完全理解您的fn fooSized 上不总是有一个隐含的界限吗?
    • @torkleyy 在函数参数上,是的。没关系,因为无论哪种情况,我们所提供的确实总是大小合适的。第二个函数采用&amp;T,即使 T 不是大小,也是如此。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多