资讯动态

仓颉标准库 NotEqual\<T> 接口详解:从 != 运算符重载到判等接口家族

发布时间:2026/10/15 11:33:42 来源:尧图企业网站定制
人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载本篇技术指南围绕仓颉Cangjie标准库核心包 std.core 中的NotEqualT接口展开介绍其在标准库中的地位、!运算符重载的声明与语义、与EqualT、EquatableT、ComparableT等判等/比较接口的继承关系并结合标准库容器与 AST 包中的实际实现讲解如何基于该接口为自定义类型接入判不等能力。读完本文你将掌握仓颉判等接口家族的设计脉络以及在自己定义的类型上正确实现并测试!运算的完整方法。接口定位标准库中的判不等能力NotEqualT是仓颉标准库核心包 std.core 中用于支持判不等操作的泛型接口。在 core_package_api/core_package_interfaces.md 中给出了它的完整声明public interface NotEqualT { operator func !(rhs: T): Bool }该接口声明了一个名为!的运算符重载函数以rhs: T右操作数为参数返回Bool类型用于判断当前实例与另一个同类型实例是否不相等。对应结构化元数据NotEqual_interface.json中同样记录了该方法原型(rhs: T) - Bool与描述判断两个实例是否不相等。需要说明的是std.core是仓颉标准库的核心包提供内置类型整型、浮点型等、常用函数与常用接口且不需要显式导入、默认导入见 core_package_overview.md。因此NotEqualT这类接口在所有仓颉程序中开箱即用。operator func !(T)判不等运算的唯一成员NotEqualT接口中只含有一个成员函数名称原型说明!operator func !(rhs: T): Bool判断两个实例是否不相等语义约定参数rhs: T—— 待比较的另一个实例右操作数返回值Bool—— 如果不相等返回true否则返回false。从语义上看a ! b与a b互为逻辑否定两者相等则!返回false两者不等则!返回true。这也是EquatableT接口为!提供默认实现的理论基础见下文。判等接口家族Equal、NotEqual 与 Equatable在仓颉标准库中判等能力被拆分为三个层次分明的接口定义均位于 core_package_interfaces.mdpublic interface EqualT { operator func (rhs: T): Bool } public interface NotEqualT { operator func !(rhs: T): Bool } public interface EquatableT : EqualT NotEqualT { operator func !(rhs: T): Bool }三者关系可概括为EqualT—— 仅负责判等运算是最小粒度的判等接口NotEqualT—— 仅负责判不等运算!EquatableT——是判等与判不等两个接口的集合体同时继承EqualT与NotEqualT并在继承的基础上提供!的默认实现。Equatable 的默认实现机制EquatableT接口中声明了operator func !(rhs: T): Bool且该函数是一个默认实现函数。其实现逻辑完全依据运算的返回值推导如果a b的返回值为true则a ! b返回false否则返回true。这意味着一个类型只要实现了EquatableT并给出的语义就自动获得正确的!行为无需重复编写判不等逻辑。这一点与ComparableT接口的设计思路一致——Comparable_interface.md 中说明ComparableT是等于、不等于、小于、大于、小于等于、大于等于接口的集合体其中、!、、、、均有默认实现统一根据compare函数的返回值Ordering枚举LT/EQ/GT推导例如a.compare(b)返回EQ时a b为true。已为内置类型与容器实现据 core_package_api/core_package_interfaces.md 说明EquatableT进而EqualT与NotEqualT已为大量仓颉内置类型实现包括基本类型Unit、Bool、Rune整型Int64、Int32、Int16、Int8、UIntNative、UInt64、UInt32、UInt16、UInt8浮点型Float64、Float32、Float16常用类型String、Array、Box标准库容器ArrayList、HashSet因此对这些类型直接书写a ! b即可完成判不等运算。标准库中的实际应用容器与 AST 包容器类型的 ! 重载在 collection 包中各容器类型均在实现判等的同时提供了!运算符重载。例如ArrayListTpublic operator func !(that: ArrayListT): Bool判断当前实例与参数指向的ArrayListT实例是否不等collection_package_class.mdHashMapK, Vpublic operator func !(right: HashMapK, V): Bool判断两个HashMap是否不等collection_package_class.md此外HashSet、LinkedList、TreeMap、TreeSet等容器同样提供!重载。这些重载的语义均为如果不等则返回 true否则返回 false与NotEqualT的语义约定保持一致。AST 包中的 TokenKind 与 Position在 ast 包中同样能看到!的运算符重载实践TokenKind枚举提供了public operator func !(right: TokenKind): Bool用于比较两个TokenKind是否不等ast_package_enums.md且其枚举值中定义了NOTEQ这个 token 种类注释即!Position结构体提供public operator func !(r: Position): Boolast_package_structs.mdToken结构体同样提供public operator func !(r: Token): Bool。这些实现表明!作为运算符重载广泛存在于仓颉标准库各包中是判等体系中不可或缺的一环。实战为自定义类型接入判不等能力对于自定义类型接入!运算通常有两种途径。方式一实现 EquatableT推荐为自定义类型实现EquatableT只需提供的实现!由接口默认实现自动推导。示例class Point : EquatablePoint { var x: Int64 var y: Int64 public init(x: Int64, y: Int64) { this.x x this.y y } public operator func (rhs: Point): Bool { return this.x rhs.x this.y rhs.y } } main() { let p1 Point(1, 2) let p2 Point(1, 2) let p3 Point(3, 4) println(p1 p2) // true println(p1 ! p2) // false由 Equatable 默认实现推导 println(p1 ! p3) // true }上例中p1 ! p2与p1 ! p3均直接可用无需手写!逻辑——这正是EquatableT在EqualT NotEqualT基础上提供默认实现的实战价值。方式二直接实现 NotEqualT当类型只关心判不等语义、或需要自定义与不完全对称的!行为时也可以只实现NotEqualTclass Version : NotEqualVersion { var major: Int64 var minor: Int64 public init(major: Int64, minor: Int64) { this.major major this.minor minor } public operator func !(rhs: Version): Bool { return this.major ! rhs.major || this.minor ! rhs.minor } }需要注意的是判等EqualT与判不等NotEqualT在语义上应当互补如果同时实现两者应保证a b与a ! b的结果互斥以符合不相等即非相等的直觉语义避免在依赖EquatableT默认实现的容器、算法中产生不一致行为。易混淆点! 与引用同一性refEq判不等!比较的是值语义上的相等性而refEq比较的是对象的内存地址是否相同。core 包提供了全局函数public func refEq(a: Object, b: Object): Bool其说明与示例见 core_package_funcs.mdrefEq判断两个Object实例的内存地址是否相同例如var r2: Rectangle r1之后refEq(r1, r2)返回true而新建的r3与r1地址不同则返回false。这与!值不等是两个维度两个不同地址的对象其值可能相等!返回false也可能不等。在设计判等实现时应明确区分这两种语义避免混淆。小结NotEqualT是 std.core 中支持判不等操作的泛型接口唯一成员为operator func !(rhs: T): Bool原型(rhs: T) - Bool语义为不等则返回 true它与EqualT共同构成EquatableT的两个父接口EquatableT基于为!提供默认实现极大简化了自定义类型的判等接入ComparableT则在更广的比较体系、、、、、!中基于compare提供全套默认实现标准库内置类型、String、Array、Box及 collection 包容器均已实现判等接口可直接使用!自定义类型可通过实现EquatableT推荐或NotEqualT接入判不等能力同时应注意与refEq内存地址比较的语义区别。进一步阅读完整的接口定义可参考 core_package_api/core_package_interfaces.md判等接口的包级索引见 std.core 类型约束小节容器与 AST 包中的!重载实现可分别查看 collection_package_class.md 与 ast_package_structs.md。赞分享人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载相关推荐仓颉标准库 std.core Equatable\T\ 接口详解判等与判不等运算的统一抽象仓颉标准库 std.core Equatable\T\ 接口详解判等与判不等运算的统一抽象 EquatableT 是仓颉语言标准库 std.core 中负人工智能AI 技能文档开发工具仓颉标准库 std.convert Parsable\T\ 接口详解parse 与 tryParse 字符串解析实战仓颉标准库 std.convert Parsable\T\ 接口详解parse 与 tryParse 字符串解析实战 导读 本文讲解仓颉Cangjie标人工智能AI 技能文档开发工具仓颉 std.core 的 Comparable\T\ 比较接口深度解析从 compare 到全套比较运算符仓颉 std.core 的 Comparable\T\ 比较接口深度解析从 compare 到全套比较运算符 ComparableT 是仓颉标准库 std人工智能AI 技能文档开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑