How to convert a boxed trait into a trait reference?

前端 未结 2 1759
醉梦人生
醉梦人生 2021-01-13 05:09

I have the following code that tries to take a reference to a trait object from a boxed trait:

trait T {}

struct S {}

impl T for S {}

fn main() {
    let          


        
相关标签:
2条回答
  • 2021-01-13 05:28

    Borrow the contents of the Box, rather than the Box itself:

    let trait_ref: &T = &*trait_box;
    

    The reason the line involving &S works is because the only way for Rust to get from Box<S> to &S is via "deref coercion"; that is, it repeatedly dereferences the value until either the types match, or it can't dereference any further.

    Coercing to a trait object, on the other hand, isn't done using dereferencing at all; it involves constructing a new pointer directly from the given one. If it can't do that, it fails.

    0 讨论(0)
  • 2021-01-13 05:43

    Box<T> implements the AsRef<T> trait, which provides the method as_ref(), so you can turn it into a reference that way:

    let trait_ref: &T = trait_box.as_ref();
    

    Normally, deref coercions mean that you don't usually need to write this out explicitly. If you pass a value of type Box<T> to a function that takes &T, the compiler will insert the conversion for you. If you want to call one of the methods on T that takes &self, the compiler will insert the conversion for you. However, deref coercions don't apply to traits, so this won't happen for trait objects.

    0 讨论(0)
提交回复
热议问题