为什么Rust转换& [& u8; 2]进入& [& u8]?

时间:2017-04-11 12:07:11

标签: rust type-conversion

Rust在此代码中如何以及为何将&[&u8; 2]转换为&[&u8]?我原本以为它必须做某种Deref诡计,但情况似乎并非如此。

struct Example<'a, 'b: 'a> {
    params: &'a [&'b u8],
}

fn main() {
    let a = 2u8;
    let b = 3u8;
    let x = &[&a, &b];
    let st = Example { params: x };
    println!(" Size of x: {} ", std::mem::size_of_val(&x));
    println!(" Size of &[&u8; 2]: {} ", std::mem::size_of::<&[&u8; 2]>());
    println!(" Size of Example: {} ", std::mem::size_of::<Example>());
}

// Console out:
// Size of x: 8
// Size of &[&u8; _]: 8
// Size of Example: 16

Playground

1 个答案:

答案 0 :(得分:1)

我要找的答案是CoerceUnsized

基于kennytm's answer并假设Rustnomicon is correct&[&T; n]被强制导入&[T],使用CoerceUnsized。相关部分:

  

以下类型之间允许强制:

     
      
  • 取消:如果T实施CoerceUnsized
  • ,则为T至U.   
     

CoerceUnsized<Pointer<U>> for Pointer<T> where T: Unsize<U>是   为所有指针类型实现(包括Box等智能指针   和Rc)。 Unsize仅自动实现,并启用   以下转换:

     
      
  • [T; n] =&gt; [T]
  •   
  • T =&gt; Trait其中T: Trait
  •