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
答案 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