Просто для забавы, опять же, но можно ли как-нибудь взять блок, содержащий определения методов, и добавить их в объект?Следующее не работает (я никогда не ожидал), но просто чтобы вы поняли, с чем я играю.
Я знаю, что могу открыть класс с помощью class << existing_object
идобавить методы таким образом, но есть ли способ для кода передавать эту информацию в блоке?
Я думаю, я пытаюсь заимствовать немного Java-мышления здесь.
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...
РЕДАКТИРОВАТЬ|Вот рабочая версия выше, основанная на ответе edgerunner:
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...