在试图更好地理解Any
特性时,我发现它是has an impl
block for the trait itself的。我不理解这个构造的目的,甚至不知道它是否有一个特定的名称。
我用“正常”特征方法和impl
块中定义的方法做了一个小实验:
trait Foo {
fn foo_in_trait(&self) {
println!("in foo")
}
}
impl dyn Foo {
fn foo_in_impl(&self) {
println!("in impl")
}
}
impl Foo for u8 {}
fn main() {
let x = Box::new(42u8) as Box<dyn Foo>;
x.foo_in_trait();
x.foo_in_impl();
let y = &42u8 as &dyn Foo;
y.foo_in_trait();
y.foo_in_impl(); // May cause an error, see below
}
编辑笔记
在Rust 1.15.0及之前的版本中,行y.foo_in_impl()
会导致错误:
错误:借用的值不够长--> src/main.rs: 20 :14 |20|让y= &42u8因为&Foo;|^不够长... 23 |}|-临时值仅存在到此处|=注意:借用的值必须在静态生存期内有效...
此错误在后续版本中不再存在,但答案中解释的概念仍然有效。
从这个有限的实验来看,在impl
块中定义的方法似乎比在trait
块中定义的方法更具限制性。很可能有一些额外的东西以这种方式解锁,但我只是还不知道它是什么!^_^
关于traits和trait objects的Rust编程语言中的章节没有提到这一点。搜索Rust源代码本身,似乎只有Any
和Error
使用这一特殊功能。我还没有在我看过源代码的几个板条箱中看到过这一点。
https://stackoverflow.com/questions/34438755
复制相似问题