In Ruby, is there a way to redefine a method of a particular instance of a class using a proc? For example:
class Foo
def bar()
return "hello"
end
end
x = Foo.new
y = Foo.new
(Something like):
y.method(:bar) = lambda { return "goodbye" }
x.bar
y.bar
Producing:
hello
goodbye
Thanks.
From stackoverflow
-
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)or, if you want to monkey-patch Object to make it easy
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!" endor, if you want to define your proc inline, this may be more readable
class << y define_method(:bar, proc { "foobar!" }) endor,
class << y define_method(:bar) { "foobar!" } endthis is the most readable, but probably doesn't fit your needs
def y.bar "goodbye" end -
You can use the syntax
class <<objectto get an object's "singleton class" (that's a special parent class belonging only to that object) and define methods only for that instance. For example:str1 = "Hello" str2 = "Foo" class <<str1 def to_spanish 'Hola' end endNow if you do
str1.to_spanish, it will return "Hola", butstr2.to_spanishwill give you a NoMethodFound exception.John Douthat : if he has an externally defined proc in a simple variable, it's difficult to get it into the new scope created by class<
0 comments:
Post a Comment