【发布时间】:2020-06-09 13:45:50
【问题描述】:
我读过这个answer,但我仍然感到困惑。
-
你如何理解
impl B for dyn A {}?trait A { fn method_a(&self) { println!("a"); } } trait B { fn method_b(&self) { println!("b") } } impl B for dyn A {} impl A for i32 {} fn main() { let x: &dyn A = &10; x.method_b(); }我可以理解
impl A for i32 {},因为i32是一个具体的类型。dyn A不是具体类型(无大小,不能按值传递),您不能声明dyn A但只能声明&dyn A。我应该解释// x.method_b(); (*x).method_b();因为
*x是dyn A? 我也可以声明
impl B for &dyn A {},那为什么我需要impl B for dyn A {}?有什么用例?-
跟进:如果我修改代码
fn main() { let x: &dyn A = &10; // have a B trait object over dyn A since // dyn A implements B let y: &dyn B = x; }它将失败并抱怨
&dyn A不是&dyn B。我知道这是一个合理的抱怨,但我为编译器提供了使用impl B for dyn A {}的选项。显然,编译器不认为这是一个选项。
【问题讨论】:
-
也在 Rust 论坛发帖和回答:users.rust-lang.org/t/…
-
更新:一个内联的、超级详细的答案。 users.rust-lang.org/t/…