3

在7 周内的 7 种语言一书中有一个问题:

如果分母为零,您将如何更改 / 以返回 0?

感谢线程self 在方法内部的意义是什么?我有一个可行的解决方案,但我想尝试在不破坏数字“/”方法的情况下做到这一点,而是将数字子类化。这是我尝试过的:

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。这是怎么回事?

4

1 回答 1

3

参数不能传递给克隆,克隆的有效设置如下:

clone := method(
  obj := primitiveAllocateMemory(sizeof(self))
  obj parent := self
  obj do(?init)
)

其次,你不能这样子Number类化。Number 对象由词法分析器在遇到文字数字时创建,并给定 type Number。该对象被设置为消息的缓存结果,这意味着,即使您截获该消息并将其评估为其他对象,您仍然会得到一个数字。实际上,出于性能原因,这是消息评估的短路。

如果你想要一个不同的 Number 类型,你必须自己用你想要的操作来实现它。这意味着继承 Object(或其他一些对象)并实现您想要的所有行为。请注意,如果您将 Number 子类化,则 Number 上的方法的实现将无法理解您的子类(它如何存储其数字)。数字方法假定在对象中编码的数值,而不是它的槽表。

于 2012-06-06T12:35:34.977 回答