• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Module#method_addedの挙動)

Module#method_addedの挙動

donttalktomeの回答

  • ベストアンサー
回答No.1

インスタンスメソッドを「クラス#メソッド」、特異メソッドを「クラス.メソッド」と書きます。 すべてのクラスはクラス Class の子クラスであり、 Class の親クラス Module の子クラスでもあるので、 Module のプライベートメソッドであるとは、 module、class 文内で関数のように レシーバなしでメソッドを呼び出せるということです。 また、特異クラスは継承ツリー上で必ず元クラスより下位になります。 つまり最初に特異メソッドがメソッド探索されます。 1 Object.method_added を定義する。これは特異メソッドなので、 フックする singleton_method_added がまだない。 2 Object.singleton_method_added の定義後すぐにそれをフックして、 同メソッドが呼ばれる 3 Module.method_added 定義をフックして Object.singleton_method_added が呼ばれる 4 Module.singleton_method_added 定義をフックして Object.singleton_method_added が呼ばれる 5 モジュール Foo はクラス Module のインスタンスで モジュールは特異クラスを持たないので特異クラスのメソッド探索はない。 もし Module#singleton_method_added、Object#singleton_method_added が定義されていたら、Foo.foo 定義をフックするが、 定義されていないので何もしない 6 同様に Foo#foo2 定義をフックする Module#method_added、 Object#method_added がないので何もしない 7 Bar.bar 定義をフックして Object.singleton_method_added が呼ばれる 8 Bar#bar2 定義をフックして Object.method_added が呼ばれる 典型的使い方: https://pastebin.com/myeP9uJq include、extend どちらでも同じようにできます。

m_matsubara
質問者

お礼

なるほど、Rubyそこそこ触って来ていたつもりですが、こうやって追いかけていくとわからないところがまだまだ掘られて行きますね。 納得がいきました。 ありがとうございます。

関連するQ&A

  • Rubyのsuperclassメソッドについて

    Rubyについての質問です。処理系は1.8.7です。 class Foo def initialize(a) @a = a end end のようなクラスを作成し、そのインスタンスを foo = Foo.new(1) のように作成します。 このとき、 foo.superclassを呼び出すと NoMethodError: undefined method `ancestors' for #<Foo:0x2b691220cc88 @a=1> とエラーになります。 一方で class FooExt < Foo def initialize (a,b) @b = b super a end end のようにFooを継承したクラスを作り、 fooext = FooExt.new(1,2) fooext.superclass とすると => Foo とsuperclassメソッドが動作します。 このsuperclassメソッドはどこで追加されたものなのでしょうか?

  • ブロック1 Ruby認定試験対策問題

    Ruby認定試験対策問題をやっていたら分からないところがあったので、 教えてください。 2.9-1.ブロック ■問題 testメソッドに渡されたブロックのselfは次のうちどれか? class Foo def test (1..3).each{|i| yield(i)} end end foo = Foo.new foo.test{|i| i } ■回答 トップレベル ■解説 ブロックはメソッドの呼出し先のselfを継承します ■疑問 ・testメソッドに渡されたブロックとは、(1..3)のことを指すのでしょうか。 ・メソッドの呼出し先とは、foo.test{|i| i }のことを意味しているのでしょうか。 ・呼出し先のselfとは、fooかFooのことでしょうか? ・「selfはメソッド内で実行されるとそのメソッドを実行しているオブジェクトを参照することが出来ます」 と別のサイトに記載されていたのですが、「トップレベルのselfとはObjectクラスのメソッドを実行している」、という意味になるのでしょうか。 それがこの問題のどこに関連しているのでしょうか。

    • ベストアンサー
    • Ruby
  • Ruby インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶ

    #!/usr/bin/ruby def foo(arg) arg.upcase end def bar(arg) arg.upcase end class Foo attr_reader :foo def initialize(arg) @foo = foo(arg) #@foo = bar(arg)とすれば期待した結果が得られる end end f=Foo.new("hoge") puts f.foo 上記実行するとエラーになります。 Class Fooの中のでfooといえば、インスタンス変数@fooであって、関数のfooではないって事なのでしょうか。 インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶことはできないのでしょうか?

  • singletonメソッドへのアクセス

    インスタンスメソッドからsingletonメソッドへのアクセスが、思ったようにできません。 はじめは、次のように記述すれば動作すると思っていました。 (MyClass.get_hello_wordをインスタンスメソッドから呼び出し) class MyClass  def hello   puts self.get_hello_word # エラー発生源  end  def self.get_hello_word   'hello every one'  end end MyClass.new.hello # エラー しかし、実際には次のように記述しなければ動きませんでした。 class MyClass  def hello   puts self.class.get_hello_word # self.classのワンクッション  end  def self.get_hello_word   'hello every one'  end end MyClass.new.hello そもそも、 def self.get_hello_word と定義したんだから、参照する時も同様にできてもいいのではないかと思うんですけれど、何か認識が間違っているのでしょうか。 だとしたら、(勘で言いますと) class << MyClass  def get_hello_word   'hello every one'  end end の文法の考え方がからんでいるような気がするのですが・・ ちんぷんかんぷんです。 どうかこの辺りの知識を教えて頂けないでしょうか。 あと、self.class.get_hello_wordの記述方法よりも簡単な(そうすべき)書き方があれば教えて下さい。

    • ベストアンサー
    • Ruby
  • define_singleton_methodについて

    define_singleton_methodについて 1.9.1p378を使用しています。 メタプログラミングに興味があって、 Classに動的に生成したmethodを追加する方法を調べてみると 色々な教科書にdefine_methodを使う例が書いてあるのを見つけました。 しかし、実際にプログラムしてみると"undefined method"になってしまいます。 Class.methods.grep /define/ してみると、"define_singleton_method"というものがあり、 define_methodの代わりに使ってみたら一応期待通りに動作しました。 googleで調べてみてもdefine_singleton_methodについて解説が見つけられませんでした。 1.9系になって名前が変わったのでしょうか? それとも似て非なるものなのでしょうか? 詳しい方、教えてください。<(_ _)>

    • ベストアンサー
    • Ruby
  • 名前空間

    module Mod1 def samemethod p "Mod1.samemethod" end module_function :samemethod end module Mod2 def samemethod p "Mod2.samemethod" end module_function :samemethod end class Cls extend Mod1 extend Mod2 end Mod1.samemethod # => (1) Cls.Mod2.samemethod # => (2) 上の記述において、(1)は、"Mod1.samemethod" と表示されるのですが、 (2)が、undefined method `Mod2' for Cls:Class (NoMethodError) となってしまいます。Clsから名前空間のメソッドを呼び出したい場合、 どういった書き方をすればいいのでしょうか? 御経験のある方、御教示願えたらと思います。

    • ベストアンサー
    • Ruby
  • 書籍 メタプログラミングRubyの中の一文

    上記書籍のP143の カレントクラスについて質問です。 上記書籍に、 【クラス定義のなかでは、カレントオブジェクトselfは定義されたクラスである】 という記述がありますが 例えば、以下のようなクラス定義あがあるとします。 class Test print self.class def self.method_01() print "メソッド01" end def method_02() return self end end クラス定義内に3箇所selfが存在しますが、 インスタンスメソッド の method_02()内のselfはnewメソッドによって 作成されたTestクラスのインスタンスの意味だと思います。 それより上の二つのselfは確かに定義中のカレントオブジェクト・・つまりTestクラス ですけれど、なぜ書籍では、クラス定義内でのselfという表現なのでしょうか? 個人的には、【クラス定義内で定義されるインスタンスメソッド内にあるselfを除くselfはカレントオブジェクトである】という風に、説明すべきだと思うのですが 何か私の解釈に誤りがあるのでしょうか?それとも、文面を気にしすぎなだけでしょうか? くだらない質問ですがご意見をおきかせください。

    • ベストアンサー
    • Ruby
  • インスタンス内から自分のクラス名を取得する方法

    クラスインスタンス内から自分のクラス名を取得しようと思うと、self.class.nameで取得できますが、type.nameでも取得できます。 しかし、typeは非推奨メソッドとなっているため、警告が出て、このままでは使用することができません。 素直にself.classを使えばいいのかもしれませんが、selfのワンクッションがどうにも気に入りません。 スマートな記述方法あったら教えて下さい。 # self.class.nameを使用する場合 class MyClass  def print_classname   puts self.class.name   # puts class.name これはエラー  end end # type.nameを使用する場合 class MyClass2  def print_classname   puts type.name # これはdeprecatedの記述で警告が出る  end end

  • Ruby

    #!/usr/local/bin/ruby class Foo def []=(x,y) print "Hello,",x,y,"!\n" end end bar = Foo.new bar["wor"] = "ld" 上記実行結果は Hello world! になるのですが、これが理解できません。 上手く説明してくれませんか?

  • Ruby on Rails: メソッドの定義で「self.」をつけるケースについて

    メソッドの名前に「self.」をつけるケースというは、 どういうことがあてはまるのでしょうか. 具体的には、以下のようなname_displayメソッドを作ったのですが、 「self.」をつけないと、undifined methodエラーになってしまいます. 偶然、self.をつけたら動いたので、そういうものかとわかりました. ただ、理由がわかりません. ご存知の方、お教えください. Userモデル id,username class User < ActiveRecord::Base def self.name_display(userid) begin @username = User.find(userid) return @username.username rescue return '削除ユーザ' end end end