26

簡単な質問ですが、私が気になっているのは...次の2つのコマンドに機能上の違いはありますか?

String::class
String.class

どちらも私が期待することを行います - つまり、それらは戻ります- しかし、とClassの使用の違いは何ですか?::.

::定数が定義されているクラスでは、タブを押した後ではなく後にタブを押すと、IRBのオートコンプリートが定数を使用可能なオプションとして返すことに気付きましたが.、これの理由はわかりません...

4

2 に答える 2

36

オペレーターは基本的に「.このメッセージをオブジェクトに送信します」と言います。あなたの例では、その特定のメンバーを呼び出しています。演算子は、演算子の::左側に定義されたスコープに「ドリルダウン」してから、演算子の右側に定義されたメンバーを呼び出します。

使用するとき::は、定義されているメンバーを参照する必要があります。使用するとき.は、オブジェクトにメッセージを送信するだけです。そのメッセージは何でもかまいませんので、オートコンプリートは では機能しますが、 では機能しませ.::

于 2008-09-04T03:31:31.083 に答える
12

実際には、オートコンプリートはで機能し.ます。#methods完了オプションは、オブジェクトを呼び出すことによって見つかります。オーバーライドすることで、これを自分で確認できますObject.methods

>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo  Object.bar
>> Object.

これは、の左側の式が.リテラルである場合にのみ機能することに注意してください。それ以外の場合、オブジェクトを呼び出す#methodsには、左側を評価する必要があり、副作用が発生する可能性があります。あなたもこれをあなた自身のために見ることができます:

[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)

自分自身を返すメソッド#bazを追加します。次に、オートコンプリートして、呼び出すことができるメソッドを取得します。IRBがを呼び出した場合、それはと同じものを取得します。代わりに、IRBには1022の提案があります。それらがどこから来たのかはわかりませんが、実際にはコンテキストに基づいていない一般的なリストであることは明らかです。ObjectObjectObject.bazObject.baz.methodsObject.methods

演算子は(また::)モジュールの定数を取得するために使用されますが、そうで.はありません。そのHTTPため、の補完には表示されますが、の補完には表示されNet::ませんNet.Net.HTTP正しくありませんが、正しいNet::HTTPです。

于 2008-09-07T02:23:09.830 に答える