Rust中比较值与引用的两种方式选择:解引用引用还是为值创建引用?
Rust中比较值与引用的两种方式选择:解引用引用还是为值创建引用?
嘿,刚学Rust碰到这种引用和值比较的困惑太正常了!我来帮你拆解这两种写法的区别,以及怎么选更顺手~
首先先补全你代码里没写完的main函数,方便我们实际看效果:
fn convert_only_if_needed(celsius_temp : &f64) -> f64 { if !(*celsius_temp > 20.0) { return *celsius_temp; } (celsius_temp * 1.8) + 32.0 } fn convert_only_if_needed_2(celsius_temp : &f64) -> f64 { if !(celsius_temp > &20.0) { return *celsius_temp } (celsius_temp * 1.8) + 32.0 } fn main() { let warm_temp = 25.0; println!("Warm temp result 1: {}", convert_only_if_needed(&warm_temp)); println!("Warm temp result 2: {}", convert_only_if_needed_2(&warm_temp)); let cool_temp = 18.0; println!("Cool temp result 1: {}", convert_only_if_needed(&cool_temp)); println!("Cool temp result 2: {}", convert_only_if_needed_2(&cool_temp)); }
接下来我们聊聊这两种比较方式的核心:
两种写法的本质
第一种:手动解引用引用
代码里的*celsius_temp是把传入的&f64引用手动解引用成底层的f64值,然后直接和字面量20.0(本身就是f64)做比较。这种写法非常直白,一眼就能看出来“我们要操作的是引用背后的那个温度值”,对Rust新手友好,几乎没有理解门槛。第二种:为字面量创建引用
这里的&20.0是把字面量20.0包装成一个临时的&f64引用,然后和参数的&f64做比较。这时候你可能会问:“比较两个引用难道不是比较内存地址吗?”其实不是,Rust为引用类型实现了PartialOrdtrait,会自动对引用做自动解引用(Deref Coercion),所以比较两个引用本质上还是在比较它们指向的底层f64值。这种写法更简洁,不需要手动加*,是很多Rust老手偏爱的风格。
怎么选择?
这两种写法在功能和性能上完全等价——编译器会对它们做相同的优化,最终生成的机器码没有任何区别。所以选择的核心是可读性和团队/个人的编码习惯:
- 如果你刚接触Rust,对引用、解引用的概念还在熟悉阶段,优先选第一种手动解引用的写法,避免因为自动解引用的特性产生困惑。
- 如果你已经习惯了Rust的自动解引用规则,或者团队代码风格更偏向简洁,第二种写法会让代码更紧凑,看起来更“Rust味”。
另外补充个小细节:你代码里的(celsius_temp * 1.8)其实也利用了自动解引用——celsius_temp是&f64,但乘法操作会自动解引用到底层值,所以不需要写成(*celsius_temp * 1.8),这也是Rust让代码更简洁的小设计哦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

