在《Rust for Rustaceans》一书中,作者写道:
总的来说,在库中你应该使用静态分发,在二进制文件中你应该使用动态分发。在库中,你希望允许用户决定哪种分发方式最适合他们,因为你不知道他们的需求是什么。
我猜,在二进制情况下,他指的是这个:
鉴于上述内容,使用装箱对象而不是特质对象的优势在哪里?这是因为需要使用生命周期吗?
总的来说,在库中你应该使用静态分发,在二进制文件中你应该使用动态分发。在库中,你希望允许用户决定哪种分发方式最适合他们,因为你不知道他们的需求是什么。
我猜,在二进制情况下,他指的是这个:
fn flexible_dispatch_method(_: &dyn MyTrait) {}
// static dispatch
//
let obj = MyType {};
flexible_dispatch_method(&obj);
// dynamic dispatch
//
let trait_obj: &dyn MyTrait = &MyType {};
flexible_dispatch_method(trait_obj);
鉴于上述内容,使用装箱对象而不是特质对象的优势在哪里?这是因为需要使用生命周期吗?
fn return_new_trait_object<'a>() -> &'a dyn MyTrait {
&MyType {}
}
还是有其他的情况吗?根据我的理解,在动态分配的情况下,对象需要在堆中进行分配,因此我认为与装箱对象相比没有太大的区别。
&MyType {}
是无法编译的。你只能返回先前接收到的数据的引用,而不能返回新创建的数据的引用。尝试做后者会创建一个悬空引用,并被借用检查器阻止。 - user4815162342