質問
Rubyでは、クラス外のクラスアクセスメソッドが暗黙的に許可されるのはどうですか?
例:
class Candy
def land
homer
end
end
def homer
puts "Hello"
end
Candy.new.land #Outputs Hello
解決
" homer"の定義methodはObjectクラスにメソッドを追加しています。無料の関数を定義していません。
Class Candyは暗黙的にObjectを継承するため、Objectのメソッドにアクセスできます。 「homer」を呼び出すと、 「陸」でメソッドの場合、メソッド解決は現在のクラスで定義を見つけることができず、スーパークラスに移動し、オブジェクトに追加したメソッドを見つけて呼び出します。
他のヒント
何が起こるかを知る簡単な方法
-
Candyオブジェクトで使用されるメソッドを解決するために検索されるクラス/モジュールは何ですか?
p Candy.ancestors#=> [キャンディ、オブジェクト、カーネル]
-
キャンディにはホーマーと呼ばれるメソッドがありますか?
p Candy.instance_methods(false).grep(" homer")#=> []
p Candy.private_instance_methods(false).grep(" homer")#=> []
-
OK Candyには 'homer'というメソッドはありません。
-
ルックアップチェーンの次のステップ(1を参照)=> "オブジェクト"
-
オブジェクトには" homer"というメソッドがあります。 ? p Object.instance_methods(false).grep(" homer")#=> []
p Object.private_instance_methods(false).grep(" homer")#=> [" homer"]
CandyのルックアップチェーンにはObjectがあり、そのObjectにはプライベートインスタンスメソッド「homer」があります。メソッドの解決は成功します
defステートメントは常に、自己が定義の時点にあるもののクラスのメソッドを定義します
-
ホーマーが定義される直前の
-
self とは何ですか?
p self#=>メイン デフ・ホーマー 「こんにちは」を置く 終了
-
では、そのタイプは何ですか?
p self.class#=>オブジェクト
homer が Object
に終わる理由 技術的には、 homer
メソッドの定義は、実際には Object
ではなく、 Kernel
モジュール上にあり、< code> Object を直接。そのため、 homer
が Candy
で定義されたローカル変数またはインスタンスメソッドではない場合、Rubyのメソッド継承チェーンは Object
を介して追跡され、混合された Kernel
モジュール、このコードが実行されます。
編集:申し訳ありませんが、なぜこれを考えたのかわかりません。メソッドは実際には Object
に存在するようです。それが実際に大きな違いをもたらすかどうかはわかりませんが、投稿する前に確認する必要があります。
Rubyにはフリーフローティング関数はありません。すべてのメソッドは何らかのオブジェクトに属します。最上位で def
したメソッドは、実際には Object
クラスのインスタンスメソッドになります。すべてが何らかのレベルで Object
であるため、すべてのオブジェクトは Object
のインスタンスメソッドにアクセスできます。