短い紹介側面initialize
。
あなたは問題を取得するためのModクラスは必要ありません。
class Foo
def yielder
p 2
yield "hello"
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
foo.class.send(:define_method,:yielder) do
p 1
yield "new hello"
end
foo.yielder do |hello|
puts hello
end
あなたがもう一度あなたの例を短くすることがあります。
class Foo
define_method(:yielder) do
yield "new hello"
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
:
class Foo
end
foo = Foo.new
foo.class.send(:define_method,:yielder) do
yield "new hello"
end
foo.yielder do |hello|
puts hello
end
これは同じです
はじめに。
そして今、あなたが望むものが正しいかどうかわかりません(そして、ルビーが正しいと理解すれば)) define_method
ブロックを受け入れてメソッド本体として使用します。新しい方法は、自分自身でブロックを受け取る必要がある場合は、あなたが定義のインタフェースでそれを定義し、それを呼び出す必要があり :
class Foo
define_method(:yielder) do | &prc |
prc.call("new hello")
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
またはあなたの例では、同じロジック:
class Foo
def yielder
yield "hello"
end
end
class Mod
def initialize
@@foo = Foo.new
end
def self.foo
@@foo
end
end
worker = Mod.new
Mod.foo.yielder do |hello|
puts hello
end
Mod.foo.class.send(:define_method,:yielder) do | &prc |
prc.call "new hello"
end
Mod.foo.yielder do |hello|
puts hello
end
へコードをより堅牢にするには、block_given?
でいくつかの小切手をお勧めします。
これは 'define_method'の' instance_eval'の使用と関係しています。なぜなら 'class_eval'と文字列を使って古風なやり方ではうまく動作し、' instance_eval'は同じエラーが発生するからです。それでもまだ見えません:/ –