Ruby 实例评估';实例方法中的行为

Ruby 实例评估';实例方法中的行为,ruby,instance-eval,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

下面是我试过的片段

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
班级人员
def测试(arg)
self.class.instance\u eval do
define_method(arg){puts“this is a class method”}
结束
结束
结束
irb(主要):005:0>人。新。测试(“foo”)
=> #
irb(主):003:0>Person.foo
NoMethodError:Person:Class的未定义方法“foo”
irb(主):007:0>Person.new.foo
这是一个类方法
=>零
这里我使用instance_eval和define_方法动态地向Person类添加一个方法。但为什么这会表现为实例方法呢?。 这完全取决于自己吗? 困惑的谁能给我解释一下,或者给我一个参考链接也很感激。

这是因为。您的接收者(
self
)是
Person
类,因此它定义了
Person
类的实例方法。您可以通过访问
Person
的元类实现所需的功能:

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

类,所以即使我使用self.class.instance\u eval,也没关系,是吗!!??但是,举例来说,eval也会做同样的事情,对吗?它将方法添加到meta_clas,对吗?不,
instance_eval
在它被调用的对象的上下文中执行提供的块(同时,它将“current class”设置为该对象的元类,但在这里并不重要,因为
define_method
self
上工作)。例如,
Person.instance\u eval
Person
对象的上下文中执行block。@Kranthi这是因为,就像我写的那样,
define\u方法
定义接收方的实例方法(而不是“当前类”)。接收方是
Person
,因此它定义了
Person
的实例方法。100%同意文件。