class_eval() 和 instance_eval() 的差别理解:
MyClass.class_eval() 里面的代码是运行在MyClass的类定义作用域中,MyClass#instance_eval() 里面的代码是运行在MyClass类的实例方法所在的作用域中,所以
class AAA
end
AAA.instance_eval do
def aaa
puts 'aaaa'
end
end
AAA.send :define_method, :aaa do
puts 'new aaa'
end
AAA.aaa # => aaa
a = AAA.new
a.aaa # => new aaa
第四行定义的是AAA的类方法。因为instance_eval()是跑在AAA的eigenclass的实例方法中也就是生成的是AAA的类方法。