在尝试Any更好地理解这个特性的同时,我看到它有一个impl阻碍特质本身.我不明白这个结构的目的,或者即使它有一个特定的名称.
我用"普通"特征方法和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
}
Run Code Online (Sandbox Code Playgroud)
编者注
在Rust的版本中,包括Rust 1.15.0,该行
y.foo_in_impl()会导致错误:Run Code Online (Sandbox Code Playgroud)error: borrowed value does not live long enough --> src/main.rs:20:14 …
理论上,动态大小类型(DST)已经着陆,我们现在应该能够使用动态大小的类型实例.实际上,我既不能使它工作,也不能理解它周围的测试.
一切似乎都围绕Sized?关键字......但你究竟是如何使用它的呢?
我可以把一些类型放在一起:
// Note that this code example predates Rust 1.0
// and is no longer syntactically valid
trait Foo for Sized? {
fn foo(&self) -> u32;
}
struct Bar;
struct Bar2;
impl Foo for Bar { fn foo(&self) -> u32 { return 9u32; }}
impl Foo for Bar2 { fn foo(&self) -> u32 { return 10u32; }}
struct HasFoo<Sized? X> {
pub f:X
}
Run Code Online (Sandbox Code Playgroud)
...但是如何创建一个HasFooDST 实例,或者具有?Bar或Bar2?
试图这样做似乎总是导致:
<anon>:28:17: 30:4 error: …Run Code Online (Sandbox Code Playgroud)