- ベストアンサー
define_singleton_methodについて
- define_singleton_methodはClassに動的に生成したmethodを追加するメソッドです。
- define_singleton_methodはdefine_methodの代わりに使用します。
- 1.9.1p378から存在しており、名前が変わったわけではありません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
define_singleton_methodは1.9で追加されたもので、Objectクラスのメソッドです。 一方define_methodはModuleクラスのprivateメソッドなので、ModuleかClassの中から呼ばないといけません。 (ClassクラスはModuleクラスのサブクラス。Rubyのprivateはサブクラスからも見える) define_methodであとからメソッドを追加しようとする場合、直接外からは呼べないので、間接的にdefine_methodを呼ぶメソッドを作成しておくか、一度Classを開くなどをやらないといけませんが、 define_singleton_methodを使えば、そんなことはせずに、簡単にできるということです。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10359)
>Classに動的に生成したmethodを追加する方法を調べてみると と書きながら、補足のサンプルを見ると、オブジェクトの特異メソッドを定義しようとしているように見えるのですが。もしそうだとすると、特異クラスを使って、 module L class R module Login def login_setup() puts "Login login_setup()" class << self define_method(:login) do |id,pass| puts "login() #{id} , #{pass}" end end end end end end
- koko_u_u
- ベストアンサー率18% (216/1139)
ダメだったコードと、OKだったコードを補足にどうぞ。
補足
OKだったコード module L class R module Login def login_setup() puts "Login login_setup()" # :loginの代わりに"login"でもよいのは理解している define_singleton_method(:login) do |id,pass| puts "login() #{id} , #{pass}" end end end end end class Y include L::R::Login def initialize login_setup() # class Yのインスタンスにlogin()が追加されるのを期待 end end # # MAIN # c = Y.new p c.methods - Object.methods #=>[:login, :login_setup] if c.respond_to?(:login) c.login("A", "B") #=>login() A , B end [NG] 1) define_singleton_method の代わりに define_method 2) __send__ 使用でdefine_method呼び出し(private methodを強制的に呼ぶ方法) 3) 他、「Rubyクックブック」などに書いてある方法=>全滅
補足
ありがとうございました。