の間に違いはありますか::そして 。Rubyでクラスメソッドを呼び出すときは?
質問
単純な質問ですが、私が気になっているのは...次の 2 つのコマンドの間に機能的な違いはありますか?
String::class
String.class
彼らは両方とも私が期待したことをします、つまり彼らは戻ってきます Class
-- しかし、 ::
そしてその .
?
定数が定義されているクラスでは、後で Tab キーを押すと、IRB のオートコンプリートによって利用可能なオプションとして定数が返されることがわかりました。 ::
しかしその後ではない .
, 、でもその理由は分かりません…。
解決
の .
オペレータは基本的に「このメッセージをオブジェクトに送信する」と指示します。あなたの例では、その特定のメンバーを呼び出しています。の ::
演算子は、演算子の左側に定義されたスコープまで「ドリルダウン」し、演算子の右側に定義されたメンバーを呼び出します。
使用するときは ::
定義されているメンバーを参照する必要があります。使用するとき .
単にオブジェクトにメッセージを送信しているだけです。このメッセージは何でもよいため、オートコンプリートは機能しません。 .
それがのためにする間 ::
.
他のヒント
実際、オートコンプリートは機能します .
. 。補完オプションは呼び出しによって見つかります。 #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
に Object
返すもの Object
自体。次に、オートコンプリートを実行して、呼び出すことができるメソッドを取得します。 Object.baz
. 。IRB が呼び出した場合 Object.baz.methods
, と同じ結果が得られます Object.methods
. 。代わりに、IRB には 1,022 件の提案があります。どこから来たのかはわかりませんが、実際にはコンテキストに基づいていない一般的なリストであることは明らかです。
の ::
演算子はモジュールの定数を取得するためにも使用されますが、 .
ではありません。それが理由です HTTP
の補完に表示されます Net::
, 、しかし、のためではありません Net.
. Net.HTTP
正しくありませんが、 Net::HTTP
は。