如何在Smalltalk中覆盖相等方法?

cai*_*sah 3 smalltalk gnu-smalltalk

我正在读一本关于Smalltalk,我正在练习关于我无法解决的消失元素异常.

Object subclass: Book [
    | isbn |
    <comment: 'A book class'>

    setIsbn: anIsbn [
        isbn := anIsbn.
    ]

    getIsbn [
        ^isbn.
    ]

    = anotherBook [
        ^self getIsbn = anotherBook getIsbn.
    ]
]

| Library |

Library := Set new: 100.
Library add: (Book new setIsbn: '0-671-2-158-1').
(Library includes: (Book new setIsbn: '0-671-2-158-1')) printNl.
Run Code Online (Sandbox Code Playgroud)

我读过我也要覆盖这个hash方法,但我不知道怎么做.如何修改Book课程以避免异常

Uko*_*Uko 7

我无法确切地告诉你你在问什么,但是为了覆盖哈希,你应该做同样的事情=,你已经覆盖了,只是通过包含不同的定义.所以你做的事情如下:

hash [
  "return hash here"
]
Run Code Online (Sandbox Code Playgroud)

如果你在问什么哈希应该是这样的...好好想想它:相同的对象必须具有相同的哈希值(但这不必相反).所以我建议你做点什么

hash [
  ^ self getIsbn hash
]
Run Code Online (Sandbox Code Playgroud)

关于消失的元素.Set是一个哈希集合.这意味着在将它的元素与您要查找的元素进行比较之前,它会通过哈希选择一个子集.因此,如果您没有覆盖哈希,则可以选择不包含所需元素的子集.

最后我建议你使用一些不同的Smalltalk实现,因为当我开始用学习它时,我的头部受伤了.Personaly我使用它提供了一个很好的用户界面,让你看到你覆盖的内容,允许你调试等.