Smalltalk 值相等和引用相等与链表相等

Smalltalk 值相等和引用相等与链表相等,smalltalk,squeak,pharo,Smalltalk,Squeak,Pharo,似乎很难获得有关Squeak的正确信息来源。 我有几个基本问题: “=”是否通过引用检查是否相等 “==”是否检查值是否相等 集合-链接列表-如果我执行以下操作: list := LinkedList new. element := list first. 这是否意味着元素和“列表优先”都是对内存中同一位置(链接列表中的第一个位置)的引用 为什么我需要重写链表的运算符=呢?我该怎么做 默认情况下,==在引用方面是相等的。在对象=中定义为 = anObject ^ self == a

似乎很难获得有关Squeak的正确信息来源。 我有几个基本问题:

  • “=”是否通过引用检查是否相等

  • “==”是否检查值是否相等

  • 集合-链接列表-如果我执行以下操作:

    list := LinkedList new.
    
    element := list first.
    
  • 这是否意味着元素和“列表优先”都是对内存中同一位置(链接列表中的第一个位置)的引用

  • 为什么我需要重写链表的运算符=呢?我该怎么做

  • 默认情况下,
    ==
    在引用方面是相等的。在对象
    =
    中定义为

    = anObject
    
       ^ self == anObject
    
    = aCharacter 
    
       ^ self == aCharacter or:[
          aCharacter isCharacter and: [
             self asciiValue = aCharacter asciiValue]]
    
    但其他类通常会覆盖它。例如,在字符
    =
    中定义为

    = anObject
    
       ^ self == anObject
    
    = aCharacter 
    
       ^ self == aCharacter or:[
          aCharacter isCharacter and: [
             self asciiValue = aCharacter asciiValue]]
    
    通过执行
    #=implementors
    ,可以获取
    =
    的所有实现者

    在您的情况下,
    元素
    首先列出
    引用同一对象。这是因为
    first
    实现为

    first
       ^ self at: 1
    
    at
    返回位置1上的元素。但是如果
    第一个
    将作为

    first
       ^ (self at: 1) copy
    
    然后它将返回一个元素的副本(或者如果您使用
    元素:=列出第一个副本
    ),然后与
    =
    相比,它们将返回
    false
    ,但是如果
    =
    以智能方式实现,则在大多数情况下它应该返回
    true


    另外,请确保您希望使用LinkedList,因为其中的一个分支主要用于进程调度,我认为有人讨论过LinkedList更像是一个实用程序集合。最常用的具有随机访问功能的集合是OrderedCollection

    您可能指的是list:=LinkedList new。是的。。。。你是对的