質問

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」を呼び出すと、 「陸」でメソッドの場合、メソッド解決は現在のクラスで定義を見つけることができず、スーパークラスに移動し、オブジェクトに追加したメソッドを見つけて呼び出します。

他のヒント

何が起こるかを知る簡単な方法

  1. Candyオブジェクトで使用されるメソッドを解決するために検索されるクラス/モジュールは何ですか?

    p Candy.ancestors#=> [キャンディ、オブジェクト、カーネル]

  2. キャンディにはホーマーと呼ばれるメソッドがありますか?

    p Candy.instance_methods(false).grep(" homer")#=> []

    p Candy.private_instance_methods(false).grep(" homer")#=> []

  3. OK Candyには 'homer'というメソッドはありません。

  4. ルックアップチェーンの次のステップ(1を参照)=> "オブジェクト"

  5. オブジェクトには" homer"というメソッドがあります。 ?    p Object.instance_methods(false).grep(" homer")#=> []

    p Object.private_instance_methods(false).grep(" homer")#=> [" homer"]

CandyのルックアップチェーンにはObjectがあり、そのObjectにはプライベートインスタンスメソッド「homer」があります。メソッドの解決は成功します

defステートメントは常に、自己が定義の時点にあるもののクラスのメソッドを定義します

    ホーマーが定義される直前の
  1. self とは何ですか?

    p self#=>メイン   デフ・ホーマー     「こんにちは」を置く   終了

  2. では、そのタイプは何ですか?

    p self.class#=>オブジェクト

homer Object

に終わる理由

技術的には、 homer メソッドの定義は、実際には Object ではなく、 Kernel モジュール上にあり、< code> Object を直接。そのため、 homer Candy で定義されたローカル変数またはインスタンスメソッドではない場合、Rubyのメソッド継承チェーンは Object を介して追跡され、混合された Kernel モジュール、このコードが実行されます。

編集:申し訳ありませんが、なぜこれを考えたのかわかりません。メソッドは実際には Object に存在するようです。それが実際に大きな違いをもたらすかどうかはわかりませんが、投稿する前に確認する必要があります。

Rubyにはフリーフローティング関数はありません。すべてのメソッドは何らかのオブジェクトに属します。最上位で def したメソッドは、実際には Object クラスのインスタンスメソッドになります。すべてが何らかのレベルで Object であるため、すべてのオブジェクトは Object のインスタンスメソッドにアクセスできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top