iolanguage - self 在方法中的意义是什么?

标签 iolanguage

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

如果分母为零,您将如何更改 / 以返回 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/

相关文章:

iolanguage - Io 语言用户输入

serialization - 如何反序列化 Io 中的对象?

import - 如何导入 Io 语言的插件?

python - 编译 io 编程语言时出错

operators - 为什么 Io REPL 和解释器给我两个不同的值?

iolanguage - Io 语言中的 newSlot 和 setSlot 有什么区别?

iolanguage - 用io编程语言读入文件