我正在阅读book on 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.
我读过我必须覆盖hash
方法,但我不知道该怎么做。如何修改Book
课程以避免异常?
答案 0 :(得分:7)
我无法确切地说出你在问什么,但是为了覆盖哈希,你应该像使用=
一样,你已经覆盖了它,只是包含了不同的定义。所以你做了类似的事情:
hash [
"return hash here"
]
如果你问的是什么哈希应该是这样的......好好想一想:相同的对象必须具有相同的哈希值(但是这不需要反过来工作)。所以我建议你做一些像
这样的事情hash [
^ self getIsbn hash
]
还有关于消失的元素。 Set是一个哈希集合。这意味着在将它的元素与您要查找的元素进行比较之前,它会通过哈希选择一个子集。因此,如果您没有覆盖哈希,它可能会选择一个不包含所需元素的子集。
最后我建议你使用一些不同的Smalltalk实现,因为当我开始用gnu-smalltalk学习它时,我的头部受伤了。 Personaly我使用pharo它提供了一个很好的用户界面,让你可以看到你覆盖的内容,允许你调试等等。
答案 1 :(得分:2)
您的代码还有一些Smalltalk惯用问题:
isbn: anIsbn
和isbn
。您可能想要创建一个以ISBN为参数的额外构造函数,这样您就不必自己发送new
和setter:
Book>>onIsbn: anIsbn
^self new
isbn: anIsbn;
yourself
答案 2 :(得分:1)
基本规则永远不会覆盖#
=而不覆盖#hash