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

Rust函数参数为何要借用类型而非借用变量名?

你混淆了Rust中&符号在「类型位置」和「模式(参数名)位置」的不同作用,也搞混了「引用类型声明」和「创建引用的操作」的使用场景,核心逻辑可以拆成几点讲清楚:

1. 先明确Rust函数参数的基础语法

所有函数参数的声明都遵循 参数模式: 类型 的固定格式:

  • 冒号左边是参数的匹配规则(最简单的用法就是直接写变量名)
  • 冒号右边是这个参数必须满足的类型要求

2. 正确写法的含义

fn display_page_count(book: &Book) 里没有什么「对类型做借用」的操作:

  • &Book 本身就是Rust的一个原生独立类型,含义是「指向Book结构体的不可变引用」,和Book所有权类型是完全不同的两种类型。我们这里只是声明:这个参数接收的是Book类型的引用,不会拿走原变量的所有权,函数执行完成后原变量还可以正常使用。
  • 你调用函数时写的 display_page_count(&book) 里的&才是真正的「借用操作符」,作用是把book变量借出一个不可变引用,刚好和参数要求的&Book类型匹配,所以可以正常执行。

3. 你设想的fn display_page_count(&book: Book)为什么不成立

  • 冒号右边写的类型是Book,意味着要求传入Book类型的所有权,调用时传参就会直接转移原变量的所有权,你后面的display_rating(&book)就会因为变量已经失效报错。
  • 冒号左边的&book是模式匹配语法,含义是「匹配一个引用类型,把引用指向的值绑定到book变量上」,和右边要求的Book所有权类型完全不匹配,编译阶段就会直接报错。

如果你硬要把&写在参数名前面,唯一合法的写法是fn display_page_count(&book: &Book),此时类型&Book和模式&book匹配,相当于自动把传入的引用解引用,把原Book的值绑定到book上,这种写法和标准的book: &Book在这个场景下效果几乎一致(Rust有自动解引用语法,访问结构体字段时会自动处理引用),但完全没必要多此一举。

你的认知误区总结

  • 不存在“对类型做借用”的说法,&T就是一个独立的引用类型,你只是在声明参数的类型是引用而已。
  • 借用操作符&是你创建引用、传参的时候使用的,不是写在参数声明的参数名前面的,参数名前面的&是模式匹配语法,和借用操作符是完全不同的两种用法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:39:03