How is it that Ruby allows a class access methods outside of the class implicitly?
Example:
class Candy
def land
homer
end
end
def homer
puts "Hello"
end
Candy.new.land #Outputs Hello
The definition of the "homer" method is adding the method to the Object class. It is not defining a free function.
Class Candy implicitly inherits from Object, and so has access to the methods in Object. When you call "homer" in the "land" method, the method resolution can't find a definition in the current class, goes to the super class, finds the method you have added to Object, and calls it.
何が起こるかを知る簡単な方法
Candy オブジェクトで使用されるメソッドを解決するために、どのクラス/モジュールが検索されますか?
p Candy.ancestors #=> [キャンディー、オブジェクト、カーネル]
Candy にはホーマーというメソッドがありますか?
p Candy.instance_methods(false).grep("homer") #=> []
p Candy.private_instance_methods(false).grep("homer") #=> []
OK Candy には「ホーマー」と呼ばれるメソッドはありません。
ルックアップ チェーンの次 (1 を参照) => 「オブジェクト」
オブジェクトには「ホーマー」というメソッドがありますか? p Object.instance_methods(false).grep("homer") #=> []
p Object.private_instance_methods(false).grep("homer") #=> ["homer"]
Candy のルックアップ チェーンには Object があり、これにはプライベート インスタンス メソッド「homer」があるため、メソッド解決は成功します。
def ステートメントは常に、定義の時点での自己のクラスでメソッドを定義します
homer が定義される直前のselfとは?
p self #=> main def homer puts "Hello" end
それで、そのタイプは何ですか?
p self.class #=> オブジェクト
これが、ホーマーがオブジェクトに行き着く理由です
技術的には、メソッドの定義は、直接ではなく、homer
実際には にKernel
混在するモジュールにあります。したがって、が で定義されたローカル変数またはインスタンス メソッドではない場合、Ruby メソッドの継承チェーンは、mix-inモジュールまでたどられてから、このコードが実行されます。Object
Object
homer
Candy
Object
Kernel
編集:申し訳ありませんが、なぜこれを考えたのかわかりません。この方法は実際に生き続けているようObject
です。実際にはそれほど大きな違いがあるかどうかはわかりませんが、投稿する前に確認する必要がありました。
Ruby にはフリー フローティング関数がありません。すべてのメソッドは、何らかのオブジェクトに属しています。def
最上位のメソッドは、実際には class のインスタンス メソッドになっていますObject
。すべてはあるObject
レベルで であるため、すべてのオブジェクトはObject
のインスタンス メソッドにアクセスできます。