只是为了好玩-通过块向对象添加方法

| 再说一次,只是为了好玩,但是有可能采取一个包含方法定义的块并将它们添加到对象的方式吗?下面的代码行不通(我从没想到过),但是这样您就可以了解我正在玩什么。 我确实知道我可以用
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...
    
已邀请:
您可以使用
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!
    
是 我怀疑您已经想到了这一点,并在寻找其他方法,但以防万一...
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 *。     

要回复问题请先登录注册