You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在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()方法:

  1. 将&&&&[i32]解引用为&&&[i32]
  2. 再解引用为&&[i32]
  3. 最后解引用为&[i32]
    最终得到函数所需的参数类型,因此代码可以正常编译运行。

这种自动转换仅适用于实现了Deref或DerefMut trait的类型,并且完全在编译阶段完成,不会产生任何运行时开销。


内容的提问来源于stack exchange,提问作者silverwen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:55:01