自我在方法中的意义是什么?

时间:2011-11-27 01:08:32

标签: iolanguage

我正在阅读Seven Weeks中的七种编程语言,其中一个问题是:

如果分母为零,您如何更改/以返回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时它不起作用?

2 个答案:

答案 0 :(得分:4)

简短版本:

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

版本较长:

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

因此,使用我们从上面所知,写self oldSlash(x)使用self作为分子和x作为分母进行除法。调用“newSlash”方法时会设置self的值,再次隐式调用您正在调用方法的对象。如果您熟悉JavaScript,则selfthis的Io名称。

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

答案 1 :(得分:0)

来自Io Programming Guide

  

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

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

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