• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:define_singleton_methodについて)

define_singleton_methodについて

このQ&Aのポイント
  • define_singleton_methodはClassに動的に生成したmethodを追加するメソッドです。
  • define_singleton_methodはdefine_methodの代わりに使用します。
  • 1.9.1p378から存在しており、名前が変わったわけではありません。

質問者が選んだベストアンサー

  • ベストアンサー
  • hoge_piyo
  • ベストアンサー率57% (15/26)
回答No.1

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/10358)
回答No.3

>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

ayudaia
質問者

補足

ありがとうございました。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.2

ダメだったコードと、OKだったコードを補足にどうぞ。

ayudaia
質問者

補足

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クックブック」などに書いてある方法=>全滅

関連するQ&A