Rust 为什么锈会转化&;[&;u8;2]插入&;[&;u8]?
Rust如何以及为什么在此代码中将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 };
&[&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是正确的),正确的答案是非大小强制,而不是解除强制。