Полностью явной версией того, что вы хотите, будет
impl Person {
fn look_up_animal(&self, animal_name: &str) -> Option<Box<&dyn Animal>> {
match animal_name {
"dog" => Some(Box::from(&self.my_dog as &dyn Animal)),
"cat" => Some(Box::from(&self.my_cat as &dyn Animal)),
_ => None,
}
}
}
Rust способен принудительно ссылаться на один слой ссылок на объекты признаков, но два слоя ссылок (оба Box
и &
) спотыкается. (Наличие ссылки внутри Box
также вызывает предупреждение clippy
.) Это предлагает другое решение.
impl Person {
fn look_up_animal(&self, animal_name: &str) -> Option<&dyn Animal> {
match animal_name {
"dog" => Some(&self.my_dog as &dyn Animal),
"cat" => Some(&self.my_cat as &dyn Animal),
_ => None,
}
}
}
На этот раз явное приведение as &dyn Animal
не требуется, поскольку существует только один слой ссылки.
impl Person {
fn look_up_animal(&self, animal_name: &str) -> Option<&dyn Animal> {
match animal_name {
"dog" => Some(&self.my_dog),
"cat" => Some(&self.my_cat),
_ => None,
}
}
}
(ссылка на игровую площадку)
Примечание: я добавил в Option
, чтобы было что возвращать, когда animal_name
нет 't "dog"
или "cat"
. Вы также можете использовать pani c или по умолчанию что-то еще, что реализует Animal
.