在书7 Languages in 7 Weeks中有一个问题:
如果分母为零,你会如何改变/返回0?
感谢线程What's the significance of self inside of a method?我有一个可行的解决方案,但我想尝试在不破坏Number“/”方法的情况下完成它,而是将子类化为Number。这是我试过的:
Zeroable := Number clone
Zeroable / = method(denom, if(denom == 0, 0, self proto / denom))
然而,这不起作用。如果我尝试实例化一个Zeroable实例,它的行为就像一个数字:
Io> ten := Zeroable 10
==> 10
Io> ten type
==> Number
Io> ten / 5
==> 2
Io> ten / 0
==> inf
Io> ten slotNames
==> list()
如果我将Zeroable实例化为“正常”方式,但它的值始终为0并且似乎没有办法改变它:
Io> zero := Zeroable clone
==> 0
Io> zero type
==> Zeroable
Io> zero / 0
==> 0
Io> zero / 2
==> 0
我认为问题是ten
被实例化的方式,但我无法弄清楚如何将“参数”传递给克隆方法,或者如何创建一个不为0的Zeroable。在这儿?
答案 0 :(得分:2)
无法将参数传递给克隆,克隆有效地设置如下:
clone := method(
obj := primitiveAllocateMemory(sizeof(self))
obj parent := self
obj do(?init)
)
其次,你不能像那样继承Number
。词法分析器遇到文字编号时会创建数字对象,并且类型为Number
。此对象被设置为消息的缓存结果,这意味着,即使您拦截消息并将其评估为其他对象,您仍将获得一个数字。实际上,由于性能原因,这是消息评估的短路。
如果你想要一个不同的数字类型,你必须自己实际使用你想要的操作来实现它。这意味着继承Object(或其他一些对象)并实现您想要的所有行为。注意,如果你是Number的子类,Number上方法的实现将无法理解你的子类(它如何存储它的数字)。数字方法假定在对象中编码的数值,而不是其槽表。