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
相关产品推荐
相关产品推荐

