12

だから、オブジェクトのシングルトンメソッドを定義したいのですが、クロージャーを使ってやりたいです。

例えば、

def define_say(obj, msg)
  def obj.say
    puts msg
  end
end

o = Object.new
define_say o, "hello world!"
o.say

「def」を介してシングルトンメソッドを定義することはクロージャーではないため、これは機能しません。そのため、「msg」が未定義の変数またはメソッドであるという例外が発生します。

私がやりたいことは、Module クラスで「define_method」メソッドを使用するようなものですが、私が知る限り、これはクラスでメソッドを定義するためにしか使用できません...しかし、Singleton メソッドが必要です。 ..

ということで、以下のように書きたいと思います。

def define_say(obj, msg)
  obj.define_singleton_method(:say) {
    puts msg
  }
end

Proc を格納するメソッドを作成せずにこれを達成する方法を知っている人はいますか?シングルトンメソッド内で Proc を使用しますか? (基本的に、これを行うには、クリーンでハッキーでない方法が必要です)

4

2 に答える 2

14

Object#define_singleton_methodちなみにruby-1.9.2に追加されました:

def define_say(obj, msg)
  obj.define_singleton_method(:say) do
    puts msg
  end
end
于 2011-06-22T22:18:07.570 に答える
8

ここにあなたが探していることをする答えがあります

def define_say(obj, msg)
  # Get a handle to the singleton class of obj
  metaclass = class << obj; self; end 

  # add the method using define_method instead of def x.say so we can use a closure
  metaclass.send :define_method, :say do
    puts msg
  end
end

使い方(IRBから貼り付け)

>> s = "my string"
=> "my string"
>> define_say(s, "I am S")
=> #<Proc:0xb6ed55b0@(irb):11>
>> s.say
I am S
=> nil

詳細については(およびそれをより簡単にする小さなライブラリ)、これを読んでください:

http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html

余談ですが、あなたがRubyプログラマーで、それを読んでいないなら、今すぐ読んでください~!

于 2008-09-25T21:15:43.160 に答える