Just for fun, again, but is it possible to take a block that contains method definitions and add those to an object, somehow? The following doesn’t work (I never expected it to), but just so you get the idea of what I’m playing around with.
I do know that I can reopen a class with class << existing_object and add methods that way, but is there a way for code to pass that information in a block?
I guess I’m trying to borrow a little Java thinking here.
def new(cls)
obj = cls.new
class << obj
yield
end
obj
end
class Cat
def meow
puts "Meow"
end
end
cat = new(Cat) {
def purr
puts "Prrrr..."
end
}
cat.meow
# => Meow
# Not working
cat.purr
# => Prrrr...
EDIT | Here’s the working version of the above, based on edgerunner’s answer:
def new(cls, &block)
obj = cls.new
obj.instance_eval(&block)
obj
end
class Cat
def meow
puts "Meow"
end
end
cat = new(Cat) {
def purr
puts "Prrrr..."
end
}
cat.meow
# => Meow
cat.purr
# => Prrrr...
You can use
class_eval(also aliased asmodule_eval) orinstance_evalto evaluate a block in the context of a class/module or an object instance respectively.