instance_eval 在实例方法中的行为
instance_eval's behaviour inside a instance method
下面是我试过的代码片段,
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 class 动态添加一个方法。但为什么这表现为实例方法?
那是完全靠自己吗?
使困惑。任何人都可以解释我或参考 link 也很感激。
因为define_method
defines instance method of the receiver。你的接收者(self
)是Person
class,所以它定义了Person
class的实例方法。您可以访问 Person
的 metaclass:
来实现您想要的
def test(arg)
class << self.class
define_method(arg) { puts 'this is a class method' }
end
end
我还没有测试过,但应该可以。
下面是我试过的代码片段,
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 class 动态添加一个方法。但为什么这表现为实例方法? 那是完全靠自己吗? 使困惑。任何人都可以解释我或参考 link 也很感激。
因为define_method
defines instance method of the receiver。你的接收者(self
)是Person
class,所以它定义了Person
class的实例方法。您可以访问 Person
的 metaclass:
def test(arg)
class << self.class
define_method(arg) { puts 'this is a class method' }
end
end
我还没有测试过,但应该可以。