我正在阅读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
时它不起作用?
答案 0 :(得分:4)
简短版本:
Number
是数字的“基类”;不是实际的数值。您不能将它用于数学运算。 self
表示调用方法的对象,结果是您想要在分区中用作分子的数字。
版本较长:
首先,一些背景知识:如您所知,分区需要两个参数。您定义的方法只接受一个参数(x
)。另一个参数是隐式的,它是你调用除法的数字。为了清楚起见,当您编写a / b
时,在对象/
上调用方法a
,它将作为参数传递值b
。在更像C语言的情况下,你会说a.divide(b)
之类的东西。您不会将a
作为参数传递,但无论如何都可以通过self
访问该函数。
因此,使用我们从上面所知,写self oldSlash(x)
使用self
作为分子和x
作为分母进行除法。调用“newSlash”方法时会设置self
的值,再次隐式调用您正在调用方法的对象。如果您熟悉JavaScript,则self
是this
的Io名称。
当您编写Number oldSlash(x)
时,您使用对象Number
作为分区中的分子。 Number
不是实际数字,而是所有数字的“基类”。它没有价值。因此,你不能对它进行数学运算。
答案 1 :(得分:0)
所有方法(新的除外)都有结构(“对象”)作为 第一个参数变量名为“self”。
但你可以省略self
,是隐含的:
Number oldSlash := Number getSlot("/")
Number / = method(x, oldSlash(x))