def define_singleton_method_by_proc(obj, name, block)
metaclass = class << obj; self; end
metaclass.send(:define_method, name, block)
end
p = proc { "foobar!" }
define_singleton_method_by_proc(y, :bar, p)
hoặc, nếu bạn muốn đối tượng khỉ vá để làm cho nó dễ dàng
class Object
# note that this method is already defined in Ruby 1.9
def define_singleton_method(name, callable = nil, &block)
block ||= callable
metaclass = class << self; self; end
metaclass.send(:define_method, name, block)
end
end
p = proc { "foobar!" }
y.define_singleton_method(:bar, p)
#or
y.define_singleton_method(:bar) do
"foobar!"
end
hoặc, nếu bạn muốn xác định inline proc của bạn, điều này có thể dễ đọc hơn
class << y
define_method(:bar, proc { "foobar!" })
end
hoặc,
class << y
define_method(:bar) { "foobar!" }
end
đây là mo st có thể đọc được, nhưng có lẽ không phù hợp với nhu cầu của bạn
def y.bar
"goodbye"
end
This question is highly related
Nguồn
2009-04-29 15:54:27
nếu anh ta có một proc được xác định bên ngoài trong một biến đơn giản, rất khó để đưa nó vào phạm vi mới được tạo bởi lớp << str1, mà không cần đến các biến toàn cục hoặc thể hiện –