Bir Kutudan & dyn T nasıl alınır <dyn T> [kopya]
Ben almaya çalışıyorum &dyn T
bir gelen Box<dyn T>
aşağıdaki örnekte olduğu gibi,. Ancak, derlenemez.
trait MyTrait {
}
struct Foo;
impl MyTrait for Foo {}
fn main() {
let b: Box<dyn MyTrait> = Box::new(Foo);
let c: &dyn MyTrait = &b;
}
(https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=69c72904fbceae5b55470a878a441b7d)
Hata mesajı
error[E0277]: the trait bound `Box<dyn MyTrait>: MyTrait` is not satisfied
--> src/main.rs:10:27
|
10 | let c: &dyn MyTrait = &b;
| ^^ the trait `MyTrait` is not implemented for `Box<dyn MyTrait>`
|
= note: required for the cast to the object type `dyn MyTrait`
Bir alabilirsiniz açıktır &T
bir mesafede Box<T>
. Eğer bir uyuyamıyrom neden anlamıyorum &dyn T
bir mesafede Box<dyn T>
.
Yanıtlar
Bir almak için &dyn T
bir gelen Box<dyn T>
, kullanmak &*
:
let c: &dyn MyTrait = &*b;
*
İçin kullanılır DEREF içeriğinin içine (kutu dyn MyTrait
) ve daha sonra &
bir referans olarak elde etmek için kullanılır.
Bu aynı zamanda bir olsun "doğru" yolu &Foo
bir mesafede Box<Foo>
. Nedeni &b
çünkü beton türleri ile çalışır olan Derefözellik verir &Box<T>
edilecek zorla için &T
:
T, Deref <Target = U> 'u uygularsa ve x, T türünün bir değeriyse, o zaman:
- & T tipi değerler, & U tipi değerlere zorlanır.
O özellik nesneler için çalışmaz nedeni olduğunu &dyn MyTrait
olabilir için geçerli olacak &Box<...>
ve zorlama başarısız olsa bile teşebbüs edilmez.