当你在一个不是类的东西上运行class_eval时会发生什么?

时间:2010-08-17 05:14:38

标签: ruby-on-rails ruby metaprogramming

test = "a"
test.class_eval do
  # what is going on here???
end

3 个答案:

答案 0 :(得分:3)

ActiveSupport将class_eval添加到Object,因此它可以用于任何事情,而不仅仅是类。

在您的示例中,它的作用相当于:

test = "a"
class << test
  # do stuff
end

Rails 2.3的实际实现如下:http://github.com/rails/rails/blob/2-3-stable/activesupport/lib/active_support/core_ext/object/singleton_class.rb

答案 1 :(得分:2)

好吧,在我的计算机上,你得到NoM​​ethodError,因为String类没有class_eval方法:)

答案 2 :(得分:2)

我认为在香草Ruby中,这是非法的。例如,如果你在irb中尝试它,你将得到一个NoMethodError。

在rails控制台中,可能会添加额外的方法,使字符串的行为类似于。