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%同意文件。