Bir Kutudan & dyn T nasıl alınır <dyn T> [kopya]

Jan 11 2021

Ben almaya çalışıyorum &dyn Tbir 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 &Tbir mesafede Box<T>. Eğer bir uyuyamıyrom neden anlamıyorum &dyn Tbir mesafede Box<dyn T>.

Yanıtlar

2 kmdreko Jan 11 2021 at 07:22

Bir almak için &dyn Tbir 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 &Foobir 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.