instance_eval在实例方法中的行为

时间:2015-01-08 13:58:12

标签: ruby instance-eval

下面是我试过的代码片段,

class Person
  def test(arg)
    self.class.instance_eval do
      define_method(arg) {puts "this is a class method"}
    end
  end
end

irb(main):005:0> Person.new.test("foo")
=> #<Proc:0x9270b60@/home/kranthi/Desktop/method_check.rb:4 (lambda)>

irb(main):003:0> Person.foo
NoMethodError: undefined method `foo' for Person:Class

irb(main):007:0> Person.new.foo
this is a class method
=> nil

这里使用instance_eval和define_method动态地向Person类添加一个方法。但为什么这表现为实例方法呢? 这完全取决于自我吗? 困惑。任何人都可以解释我或参考链接也赞赏。

1 个答案:

答案 0 :(得分:1)

这是因为define_method defines instance method of the receiver。您的接收者(self)是Person类,因此它定义了Person类的实例方法。您可以实现您想要访问Person的元类:

def test(arg)
  class << self.class
    define_method(arg) { puts 'this is a class method' }
  end
end

我没有对它进行过测试,但它应该有效。