Pharo Smalltalk中=和==之间的区别是什么?

Pharo Smalltalk中=和==之间的区别是什么?,smalltalk,pharo,Smalltalk,Pharo,法罗Smalltalk中的=和=有什么区别?它们的名称是什么,一个是相等的,另一个是相等的 = ~= equality / inequality (deep) == ~~ equality / inequality (shallow) 是,==是标识,它使用原语比较指针是否指向同一地址(即同一对象) =是相等的,意味着两个对象相等,尽管它们可能是两个不同的对象。默认情况下,=使用=,但可以重新实现。另外,当您重新实现=时,建议您也重新实现散列,这样散列集合就不会疯狂了TL;DR:=:

法罗Smalltalk中的
=
=
有什么区别?它们的名称是什么,一个是相等的,另一个是相等的

= ~=    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!"