此问题在此处已有答案:
Why is it discouraged to accept a reference &String, &Vec, or &Box as a function argument?(4个答案)
12天前关门了。
我正在学习Rust中的Dyn Traits。我看到有两个使用它的选项
1.框(& B)
1.&dyn TraitName
什么时候应该使用第一个,什么时候应该使用第二个?
我没有看到我的代码中的显着差异(process_animal
和process_animal_box
函数)
我的密码
struct Cat {}
struct Dog {}
trait Animal {
fn say(&self);
}
impl Animal for Cat {
fn say(&self) {
println!("Meow!!!");
}
}
impl Animal for Dog {
fn say(&self) {
println!("Woow!");
}
}
fn process_animal(animal: &dyn Animal) {
animal.say();
}
fn process_animal_box(animal: &Box<dyn Animal>) {
animal.as_ref().say();
}
fn main() {
let cat = Cat {};
process_animal(&cat);
let dog: Box<dyn Animal> = Box::new(Dog {});
process_animal_box(&dog);
}
字符串
1条答案
按热度按时间xriantvc1#
Box<T>
可以被重新借用到&T
中,因此您几乎不需要将&Box<T>
作为参数,类似于&str
和&String
的指导原则只要您需要所有权,就使用
Box<T>
(注意没有&
)。