Pharo Smalltalk 中 = 和 == 有什么区别?

uno*_*nom 5 smalltalk pharo

=Pharo Smalltalk和Pharo Smalltalk之间有什么区别==?他们分别叫什么名字isEqual

= ~=    equality / inequality (deep)
== ~~   equality / inequality (shallow)
Run Code Online (Sandbox Code Playgroud)

Lea*_*lia 5

需要考虑的一件重要事情是,它=不仅在代码比较两个对象时才显式使用。该消息=还被许多其他消息隐式使用,例如:includes:<=>=remove:keyAtValue:indexOf:upTo:peekFor:occurrencesOf:add:(在Set)、at:(以及朋友at:ifAbsent:at:ifAbsentPut:等)以及许多其他消息。

这意味着当您=在类中重新定义时,您应该确保

  1. 您的实现=是稳健的(例如,banana = car没有给出错误)并且
  2. 每次你重新定义,=你也重新定义hash

第一个条件的原因是能够比较任意两个对象,而发送者在发送消息之前不必特别小心=

第二个原因是,如果将来您的对象在散列集合(SetDictionaryBag等)中使用,它们将遵守这些实体所需的重要不变量

      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确保环境中不会存在具有相同基础字符串的两个实例。


Uko*_*Uko 4

是的,==是身份,它使用原语来比较指针是否指向相同的地址(即相同的对象)。

=是相等,意味着两个对象是相等的,尽管它们可能是两个不同的对象。默认情况下=使用==,但可以重新实现。另外,当您重新实现时=,建议也重新实现hash,这样散列集合就不会变得疯狂