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

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为引用类型实现了PartialOrd trait,会自动对引用做自动解引用(Deref Coercion),所以比较两个引用本质上还是在比较它们指向的底层f64值。这种写法更简洁,不需要手动加*,是很多Rust老手偏爱的风格。

怎么选择?

这两种写法在功能和性能上完全等价——编译器会对它们做相同的优化,最终生成的机器码没有任何区别。所以选择的核心是可读性和团队/个人的编码习惯:

  • 如果你刚接触Rust,对引用、解引用的概念还在熟悉阶段,优先选第一种手动解引用的写法,避免因为自动解引用的特性产生困惑。
  • 如果你已经习惯了Rust的自动解引用规则,或者团队代码风格更偏向简洁,第二种写法会让代码更紧凑,看起来更“Rust味”。

另外补充个小细节:你代码里的(celsius_temp * 1.8)其实也利用了自动解引用——celsius_temp是&f64,但乘法操作会自动解引用到底层值,所以不需要写成(*celsius_temp * 1.8),这也是Rust让代码更简洁的小设计哦~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:58:06