我正在研究《铁 rust 》中的特点和特点对象.在第Trait chapter题中,我解决第六个练习的方式与编译器的建议不同.以下代码定义了两个 struct (Sheep
和Cow
)和一个特征(Animal
).Sheep
和Cow
都通过提供它们自己的noise
方法实现来实现Animal
特征.
有两个函数,random_animal_if
和random_animal_match
,它们接受参数并返回对动态特征对象的引用.
struct Sheep {}
struct Cow {}
trait Animal {
fn noise(&self) -> String;
}
impl Animal for Sheep {
fn noise(&self) -> String {
"baaaaah!".to_string()
}
}
impl Animal for Cow {
fn noise(&self) -> String {
"moooooo!".to_string()
}
}
fn random_animal_if(random_number: f64) -> &'static dyn Animal {
if random_number < 10.0 {
&Sheep {}
} else if random_number > 20.0 {
&Cow {}
} else {
panic!()
}
}
fn random_animal_match(random_string: &str) -> &dyn Animal {
match random_string {
"sheep" => &Sheep {},
"cow" => &Cow {},
_ => panic!(),
}
}
fn main() {
let animal = random_animal_if(21.0);
println!("Randomly animal says {}", animal.noise());
let animal = random_animal_match("sheep");
println!("Randomly animal says {}", animal.noise());
}
这两个函数都基于输入创建并返回Sheep
或Cow
对象.其中之一在浮点数输入上使用条件句.另一种方法是在给定的字符串片上使用模式匹配.逻辑是相同的,但是如果我省略了random_animal_if
返回类型的&'static
生存期规范,那么编译器就会抛出这个错误:
错误[E0106]:缺少生存期说明符
有趣的是,如果输入参数类型从f64
更改为&str
,则可以删除静态生存期注释.为什么?这两种类型有什么不同?