Что происходит, когда вы запускаете class_eval для чего-то, что не является классом? - PullRequest
2 голосов
/ 17 августа 2010
test = "a"
test.class_eval do
  # what is going on here???
end

Ответы [ 3 ]

4 голосов
/ 17 августа 2010

ActiveSupport добавляет class_eval к объекту, чтобы его можно было использовать с чем угодно, не только с классами.

В вашем примере то, что он делает, эквивалентно:

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

2 голосов
/ 17 августа 2010

Я думаю, что в ванильном Ruby это незаконно. Например, если вы попробуете это в irb, вы получите NoMethodError.

В консоли rails могут быть добавлены дополнительные методы, которые заставляют строки вести себя как классы.

2 голосов
/ 17 августа 2010

Ну, на моем компьютере вы получаете NoMethodError, потому что класс String не имеет class_eval метода:)

...