3

私は Seven Programming Languages in Seven Weeks を読んでいますが、問題の 1 つに次のように書かれています。

分母がゼロの場合、どのように変更/して戻りますか?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メソッドが呼び出されたオブジェクトを表します。これは、除算で分子として使用する数値であることがわかります。

より長いバージョン:

まず、いくつかの背景: ご存じのように、除算には 2 つの引数があります。定義しているメソッドは、1 つの引数 ( x) のみを取ります。もう 1 つの引数は暗黙的であり、除算を呼び出す Number です。明確にするために、メソッドを作成a / bしているときに、オブジェクトでメソッド/が呼び出されa、値がパラメーターとして渡さbれます。より C に似た言語では、次のように言いますa.divide(b)aパラメータとして渡しませんが、とにかく関数からアクセスできますself.

So, using what we know from above, writing self oldSlash(x) performs division using self as numerator and x as denominator. The value of self is set when your "newSlash" method is called, once again implicitly to the object you're calling the method on. If you're familiar with JavaScript, self is Io's name for this.

When instead you write Number oldSlash(x) you use the object Number as the numerator in the division. Number is not an actual number, but rather the "base class" for all numbers. It does not have a value. Hence you cannot perform mathematical operations on it.

于 2011-11-27T10:58:30.350 に答える
0

Ioプログラミングガイドから

すべてのメソッド(newを除く)は、最初の引数として構造(「オブジェクト」)を持ち、変数の名前は「self」です。

ただし、省略できますself。暗黙的です。

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