3

我正在七周内通读七种编程语言,其中一个问题是:

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

我首先尝试定义自己的/并将其实现代理到原始/方法,如下所示:

Number oldSlash := Number getSlot("/")
Number / = method(x, Number oldSlash(x))

然而,这对我不起作用。在做了一些谷歌搜索后,我发现了一段类似的代码。我发现的代码self在该方法的实现中使用。所以,我尝试使用self它似乎工作得很好:

Number oldSlash := Number getSlot("/")
Number / = method(x, self oldSlash(x))

我的问题是:为什么在使用关键字时会起作用self,为什么在使用关键字时不起作用Number

4

2 回答 2

4

简短版本:

Number是数字的“基类”;不是实际的数值。您不能将其用于数学运算。self表示您的方法被调用的对象,结果是您要在除法中用作分子的数字。

更长的版本:

首先,一些背景知识:如您所知,除法需要两个参数。您定义的方法只接受一个参数(x)。另一个参数是隐含的,它是您调用除法的数字。为了清楚起见,当您编写a / b方法时,会/在对象上调用该方法a,并将值b作为参数传递。在更像 C 的语言中,你会说类似a.divide(b). 您不a作为参数传递,但无论如何都可以从函数中访问它,如self.

因此,使用我们从上面知道的内容,写作使用分子和分母self oldSlash(x)进行除法。的值是在调用“newSlash”方法时设置的,再次隐式设置为您正在调用该方法的对象。如果你熟悉 JavaScript,Io 就是.selfxselfselfthis

相反,当您编写时Number oldSlash(x),您使用对象Number作为除法中的分子。Number不是实际数字,而是所有数字的“基类”。它没有价值。因此,您无法对其执行数学运算。

于 2011-11-27T10:58:30.350 回答
0

来自Io 编程指南

所有方法(新方法除外)都具有结构(“对象”)作为变量名为“self”的第一个参数。

但是你可以省略self, 是隐含的:

Number oldSlash := Number getSlot("/")
Number / = method(x, oldSlash(x))
于 2011-12-04T20:35:00.013 回答