Rust 为什么锈会转化&;[&;u8;2]插入&;[&;u8]?

Rust 为什么锈会转化&;[&;u8;2]插入&;[&;u8]?,rust,type-conversion,Rust,Type Conversion,Rust如何以及为什么在此代码中将&[&u8;2]转换为&[&u8]?我原以为它一定是在搞恶作剧,但事实似乎并非如此 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 };

Rust如何以及为什么在此代码中将
&[&u8;2]
转换为
&[&u8]
?我原以为它一定是在搞恶作剧,但事实似乎并非如此

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

struct-Example我想要的答案是

基于并假设,
&[&T;n]
被强制为
&[T]
,使用。有关部分:

以下类型之间允许强制:

  • 未调整大小:如果T实现强制,则从T到U
对指针强制,其中T:Unsize
为 针对所有指针类型(包括智能指针,如
Box
Rc
)。Unsize仅自动实现,并启用 以下转换:

  • [T;n]
    =>
    [T]
  • T
    =>
    Trait
    其中
    T:Trait

你能解释一下你为什么说“但事实似乎并非如此”吗?否则,提议的副本似乎回答了你所有的问题。解除强制可能是一个令人困惑的机制。称之为恶作剧听起来你低估了它P@Shepmaster我已经研究了切片、数组,Deref没有列出强制。具体列在哪里?@DanielFath副本的答案一字不差地说:“1.当某个东西期望a&[T]而你给它a&[T;n]时,它会无声地强制;@E_net4,假设kennytm是正确的(RustNomicon是正确的),正确的答案是非大小强制,而不是解除强制。