再说一次,只是为了好玩,但是有没有可能以某种方式将包含方法定义的块添加到对象中呢?下面的代码不起作用(我从来没想过它会起作用),但我想让你明白我到底在玩什么。
我知道我可以用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...发布于 2011-05-12 13:17:41
您可以使用class_eval(也称为module_eval)或instance_eval分别在类/模块或对象实例的上下文中计算块。
class Cat
def meow
puts "Meow"
end
end
Cat.module_eval do
def purr
puts "Purr"
end
end
kitty = Cat.new
kitty.meow #=> Meow
kitty.purr #=> Purr
kitty.instance_eval do
def purr
puts "Purrrrrrrrrr!"
end
end
kitty.purr #=> Purrrrrrrrrr!发布于 2011-05-12 13:04:47
是
我怀疑你想到了这一点并在寻找其他方法,但以防万一...
class A
def initialize
yield self
end
end
o = A.new do |o|
class << o
def purr
puts 'purr...'
end
end
end
o.purr
=> purr...根据记录,这不是动态添加方法的通常方式。通常,动态方法以块本身的形式启动,例如,请参见*Module#define_method*.
https://stackoverflow.com/questions/5973446
复制相似问题