=Pharo Smalltalk和Pharo Smalltalk之间有什么区别==?他们分别叫什么名字isEqual?
= ~= equality / inequality (deep)
== ~~ equality / inequality (shallow)
Run Code Online (Sandbox Code Playgroud)
需要考虑的一件重要事情是,它=不仅在代码比较两个对象时才显式使用。该消息=还被许多其他消息隐式使用,例如:includes:、<=、>=、remove:、keyAtValue:、indexOf:、upTo:、peekFor:、occurrencesOf:、add:(在Set)、at:(以及朋友at:ifAbsent:、at:ifAbsentPut:等)以及许多其他消息。
这意味着当您=在类中重新定义时,您应该确保
=是稳健的(例如,banana = car没有给出错误)并且=你也重新定义hash。第一个条件的原因是能够比较任意两个对象,而发送者在发送消息之前不必特别小心=。
第二个原因是,如果将来您的对象在散列集合(Set、Dictionary、Bag等)中使用,它们将遵守这些实体所需的重要不变量
IF a = b THEN a hash = b hash
Run Code Online (Sandbox Code Playgroud)
鉴于确保hash价值观是一种非常好的做法SmallIntegers,人们可以说
IF a = b THEN a hash == b hash
Run Code Online (Sandbox Code Playgroud)
换句话说,每次两个对象被认为相等时,它们的hash值应该被授予相同。
命名
=当阅读涉及诸如等于或等于之a = b类的表达式时。a ba b
当阅读a == bSmalltalkers 时,会说a 和 b 是同一个对象,或者a 是相同的 b,甚至a 是等于 b。
进一步评论
该=消息是特定于域的,这意味着由您决定两个 Smalltalk 对象何时代表应用程序中的同一个对象。
该==消息是一个系统功能,这意味着它是由虚拟机 (VM) 实现的,该虚拟机验证正在比较的对象是否占据内存中完全相同的位置。换句话说,当两个变量a和绑定到同一个对象时,它们b是相等的。
例子
a := 'This String'.
b := 'This' , ' ', 'String'.
a == b "false".
a = b "true"
f := 2 / 3.
g := 2 / 3.
f = g "true".
f == g "false"
Run Code Online (Sandbox Code Playgroud)
一般来说,SmallInteger这=也是==因为VM以特殊方式对它们进行编码。
n := 3 + 4.
m := 2 + 5.
n = m "true".
n == m "true".
Run Code Online (Sandbox Code Playgroud)
另一个有趣的情况发生在类的实例上Symbol
s := #symbol.
t := 'symbol' asSymbol.
s = t "true".
s == t "true!"
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为该类Symbol确保环境中不会存在具有相同基础字符串的两个实例。
是的,==是身份,它使用原语来比较指针是否指向相同的地址(即相同的对象)。
=是相等,意味着两个对象是相等的,尽管它们可能是两个不同的对象。默认情况下=使用==,但可以重新实现。另外,当您重新实现时=,建议也重新实现hash,这样散列集合就不会变得疯狂