Pharo Smalltalk中=和==之间的区别是什么?
法罗Smalltalk中的Pharo Smalltalk中=和==之间的区别是什么?,smalltalk,pharo,Smalltalk,Pharo,法罗Smalltalk中的=和=有什么区别?它们的名称是什么,一个是相等的,另一个是相等的 = ~= equality / inequality (deep) == ~~ equality / inequality (shallow) 是,==是标识,它使用原语比较指针是否指向同一地址(即同一对象) =是相等的,意味着两个对象相等,尽管它们可能是两个不同的对象。默认情况下,=使用=,但可以重新实现。另外,当您重新实现=时,建议您也重新实现散列,这样散列集合就不会疯狂了TL;DR:=:
=
和=
有什么区别?它们的名称是什么,一个是相等的,另一个是相等的
= ~= equality / inequality (deep)
== ~~ equality / inequality (shallow)
是,
==
是标识,它使用原语比较指针是否指向同一地址(即同一对象)
=
是相等的,意味着两个对象相等,尽管它们可能是两个不同的对象。默认情况下,=
使用=
,但可以重新实现。另外,当您重新实现=
时,建议您也重新实现散列
,这样散列集合就不会疯狂了TL;DR:=:“等于”,==:“与相同”
在对象中>>#=
在ProtoObject中>>#==
==一个对象
“原语。回答接收者和参数是否相同
对象(具有相同的对象指针)。不要在中重新定义消息==
任何其他类!必需。无查找。不要在任何子类中重写。
请参阅对象文档whatIsAPrimitive。“
与字典相比,它是一个完全不同的野兽(Bas在“有趣”中的实现)
`字典>>#=字典
“两本字典是相等的,如果
(a) 它们是同一种东西。
(b) 他们有一套相同的钥匙。
(c) 对于每个(公共)键,它们具有相同的值。
更改前参见第16760期“
有趣的是,它们共享相同的hash
方法
`集合>>#散列
“为接收器回答一个整数散列值,以便,
--未更改对象的哈希值随时间变化为常量,并且
--两个相等的对象具有相等的哈希值“
|散列|
散列:=自种类散列。
self size需要考虑的一个重要因素是,=
不仅在代码比较两个对象时显式使用。消息=
也被许多其他消息隐式使用,例如:包括:
,=
,删除:
,键值:
,索引:
,最多:
,peekFor:
,发生:
,添加:
(在集合
),处:
(还有朋友at:ifAbsent:
,at:ifAbsentPut:
,等等),以及许多其他人
这意味着,当您在类中重新定义=
时,您应该确保
=
的实现是健壮的(例如,香蕉=car
不会给出错误),并且
每次重新定义=
时,您也会重新定义哈希值
第一个条件的原因是能够比较任意两个对象,而发送者在发送=
消息之前无需特别注意
第二个原因是,如果将来在散列集合中使用对象(集合
,字典
,包
,等等),它们将遵守这些实体所需的重要不变量
IF a = b THEN a hash = b hash
考虑到确保散列
值是小整数
是一个非常好的实践,我们可以说
IF a = b THEN a hash == b hash
换句话说,每当两个对象被认为相等时,它们的散列值应被赋予相同的值
命名
当阅读一个包含=
的表达式,例如a=b
时,人们会说a
等于b
或a
等于b
当阅读a==b
时,小人说a
和b
是同一个对象,或者a
等于b
或者a
等于a
甚至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"
=
消息是特定于域的,这意味着由您决定两个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"
一般来说,SmallInteger
s是=
,它们也是=
,因为VM以一种特殊的方式对它们进行编码
n := 3 + 4.
m := 2 + 5.
n = m "true".
n == m "true".
另一个有趣的例子是类Symbol
s := #symbol.
t := 'symbol' asSymbol.
s = t "true".
s == t "true!"
之所以会出现这种情况,是因为Symbol
类确保环境中不存在具有相同基础字符串的两个实例。=
表示相等(对象的值相等),而=
表示标识(对象相同)。请参阅。请注意,基于xor
的哈希通常是次优的,因为它们使用的位的顺序不高于被xor
ed的元素中的位。命名如何?一个“等于”另一个“等于”或“等于”?@unmercea我认为它是相等的,但通常我使用“等于”对于=
我说:检查它是否是同一个对象命名如何?一个“等于”另一个“等于”或“与”?@unmarcea=
表示“等于”或“与”具有相同的值。=
表示“与”相同或“与”相同的对象”。
IF a = b THEN a hash == b hash
a := 'This String'.
b := 'This' , ' ', 'String'.
a == b "false".
a = b "true"
f := 2 / 3.
g := 2 / 3.
f = g "true".
f == g "false"
n := 3 + 4.
m := 2 + 5.
n = m "true".
n == m "true".
s := #symbol.
t := 'symbol' asSymbol.
s = t "true".
s == t "true!"