Rust 学习笔记:关于 Trait 的练习题
Rust 学习笔记:关于 Trait 的练习题
以下代码能否通过编译?若能,输出是?
trait MakeNoice {
fn make_noice(&self) {
println!("(silence)");
}
}
struct Dog {}
struct Cat {}
impl MakeNoice for Dog {
fn make_noice(&self) {
println!("bark");
}
}
impl MakeNoice for Cat {}
fn main() {
let dog = Dog {};
dog.make_noice();
let cat = Cat {};
cat.make_noice();
}
答:可以通过编译。
输出:
bark
(silence)
以下是关于 Rust 允许哪些类型的 trait 实现的说法。请选择正确的陈述。
A. 你可以为外部类型实现本地 trait
B. 你可以为外部类型实现外部 trait
C. 你可以为本地类型实现本地 trait
D. 你可以为本地类型实现外部 trait
答:A、C、D。
以下代码能否通过编译?若能,输出是?
use std::fmt::Display;
fn displayable<T: Display>(t: T) -> impl Display {
t
}
fn main() {
let s = String::from("hello");
let mut s2 = displayable(s);
s2.push_str(", world!");
println!("{s2}");
}
答:不能通过编译。因为函数返回值只确保 s2 实现了 Display trait,Display 没有 push_str 方法。
要使以下函数通过类型检查,对 T 需要的最小 trait 约束是什么?
fn f<T: /* ??? */>(t: &T) {
let t2 = t.clone();
println!("{t2}");
}
答:Clone + Display。