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

Rust语言中eq()方法与==运算符的区别是什么?

问题核心原因

这个差异本质是Rust对运算符和方法调用的类型匹配规则不同:
==运算符没有自动引用/解引用转换逻辑,严格要求左右操作数类型匹配PartialEq实现约束;而方法调用时会触发自动引用/解引用(autoref/autoderef)机制,自动调整类型匹配方法签名。

二者具体区别
  • 语法糖展开逻辑不同
    • ==是PartialEq的语法糖,a == b等价于<A as PartialEq<B>>::eq(&a, &b),其中A是a的类型、B是b的类型。你的示例中a是整数类型、b是整数引用类型,整数类型没有实现PartialEq<&整数>,因此直接抛出编译错误。
    • 调用a.eq(b)时,Rust会自动调整a的引用层级匹配eq方法的&self签名,同时匹配泛型参数Rhs的类型:整数类型本身实现了PartialEq<整数>,对应的eq方法要求入参是&整数,你传入的b刚好完全匹配参数要求,因此可以正常编译。
  • 类型匹配严格度不同
    • 运算符的类型匹配是双向严格约束:必须满足左侧类型实现PartialEq<右侧类型>,没有任何隐式转换空间。
    • 方法调用的类型匹配是单向适配:会自动尝试给调用者增减引用层级,直到匹配self签名,同时对参数做自动解引用转换(如果适用),匹配成本远低于运算符。

你可以通过手动匹配类型让==正常工作,示例如下:

fn main() {
    let a = 1;
    let b = &a;
    println!("{}", a == *b); // 手动解引用b,两边都是整数类型,编译通过
    println!("{}", &a == b); // 手动给a加引用,两边都是整数引用类型,编译通过
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 14:27:00