为何在Rust中可将多重引用传递给接收单引用的函数?
Rust中多级引用切片为何能匹配函数参数类型
在Rust中,以下代码可以正常运行:
fn test_slice(slices: &[i32]) { println!("{:?}", slices); } fn main() { let slices:&[i32] = &[1,2,3]; test_slice(slices); }
但为何以下代码同样可以正常运行,而非抛出类型不匹配错误?
fn main() { let slices:&[i32] = &[1,2,3]; test_slice(&&&slices); }
这背后是Rust的**Deref强制转换(Deref coercion)**机制在起作用:
slices的类型是&[i32],也就是对i32切片的引用。&&&slices的实际类型是&&&&[i32]——三层额外引用包裹着原切片引用。- 函数
test_slice需要的参数类型是&[i32],Rust会自动通过Deref强制转换,逐层解引用这个多级引用,直到匹配目标类型。
具体来说,&[i32]实现了Deref trait,它的Target关联类型是[i32]。当编译器发现类型不匹配但可以通过逐层解引用修正时,会自动多次调用deref()方法:
- 将
&&&&[i32]解引用为&&&[i32] - 再解引用为
&&[i32] - 最后解引用为
&[i32]
最终得到函数所需的参数类型,因此代码可以正常编译运行。
这种自动转换仅适用于实现了Deref或DerefMut trait的类型,并且完全在编译阶段完成,不会产生任何运行时开销。
内容的提问来源于stack exchange,提问作者silverwen
相关产品推荐
相关产品推荐

