Функции new_foo1
и new_foo2
возвращают одну и ту же черту Foo
с использованием разных шаблонов. Я не вижу между ними какой-либо функциональной разницы, кроме того, что new_foo1
они более подробны. Есть ли среди этих двух предпочтительный способ? Есть ли какие-нибудь тонкие ответвления у любого из этих паттернов?
trait Foo {
fn bar(&self);
}
struct FooIm {}
impl Foo for FooIm {
fn bar(&self) {
println!("bar from FooIm")
}
}
fn new_foo1<'a>() -> &'a (dyn Foo + 'a) {
&FooIm {}
}
fn new_foo2() -> Box<dyn Foo> {
let f = FooIm {};
Box::new(f)
}
fn main() {
let f1 = new_foo1();
let f2 = new_foo2();
f1.bar();
f2.bar();
}
new_foo1
немного более сложным, чем просто возврат литерала (соответствующий вопрос о возврате ссылок на локальные значения < / а>). Попробуйте, например,FooIm
, который содержит данные из кучи, такие какVec
илиString
, и, как описано в связанном дубликате, будет компилироваться толькоnew_foo2
. - person E_net4 the curator   schedule 22.09.2020