首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只是为了好玩-通过块将方法添加到对象中

只是为了好玩-通过块将方法添加到对象中
EN

Stack Overflow用户
提问于 2011-05-12 12:56:17
回答 2查看 87关注 0票数 2

再说一次,只是为了好玩,但是有没有可能以某种方式将包含方法定义的块添加到对象中呢?下面的代码不起作用(我从来没想过它会起作用),但我想让你明白我到底在玩什么。

我知道我可以用class << existing_object重新打开一个类并以这种方式添加方法,但是有没有办法让代码在块中传递这些信息呢?

我想我在这里尝试借用一点Java思想。

代码语言:javascript
复制
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的回答,以下是上面的工作版本:

代码语言:javascript
复制
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...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-12 13:17:41

您可以使用class_eval(也称为module_eval)或instance_eval分别在类/模块或对象实例的上下文中计算块。

代码语言:javascript
复制
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!
票数 4
EN

Stack Overflow用户

发布于 2011-05-12 13:04:47

我怀疑你想到了这一点并在寻找其他方法,但以防万一...

代码语言:javascript
复制
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*.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5973446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档