我正在七周内通读七种编程语言,其中一个问题是:
如果分母为零,您将如何更改 /
以返回 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
时为什么不起作用?
最佳答案
简短版:
Number
是数字的“基类”;不是实际的数值。您不能将其用于数学运算。 self
表示调用您的方法的对象,结果是您要在除法中用作分子的数字。
较长的版本:
首先,介绍一些背景知识:如您所知,除法需要两个参数。您定义的方法只接受一个参数(x
)。另一个参数是隐式的,它是你调用除法的数字。为了清楚起见,当您编写 a/b
时,方法 /
会在对象 a
上调用,并且它会传递值b
作为参数。在更像 C 的语言中,您会说类似 a.divide(b)
的内容。您没有将 a
作为参数传递,但无论如何它都可以作为 self
从函数中访问。
因此,使用我们从上面了解到的知识,编写 self oldSlash(x)
执行除法,使用 self
作为分子,x
作为分母。 self
的值在您的“newSlash”方法被调用时设置,再次隐式地设置给您调用该方法的对象。如果您熟悉 JavaScript,self
是 Io 对 this
的名称。
当您改为编写 Number oldSlash(x)
时,您使用对象 Number
作为除法中的分子。 Number
不是实际数字,而是所有数字的“基类”。它没有值(value)。因此,您无法对其执行数学运算。
关于iolanguage - self 在方法中的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8282911/