Module.new с class_eval - PullRequest
       11

Module.new с class_eval

4 голосов
/ 12 мая 2010

Это большой коммит. Но я хочу, чтобы вы сосредоточились на этом блоке изменений. http://github.com/rails/rails/commit/d916c62cfc7c59ab6411407a05b946d3dd7535e9#L2L1304

Даже без понимания полного контекста кода я не могу придумать сценарий, в котором я бы использовал

include Module.new {
  class_eval <<-RUBY
    def foo
       puts 'foo'
    end
  RUBY
}

Тогда конечный результат заключается в том, что в корневом контексте (self непосредственно перед include Module.new) был добавлен метод с именем foo.

Если я возьму код Module.new и оставлю только class_eval, в этом случае у меня также будет метод, называемый foo в self.

Что мне не хватает.

Ответы [ 2 ]

5 голосов
/ 12 мая 2010

Если вы копаете документацию , вы обнаружите, что включение модуля добавит туда методы, только если они еще не определены. Таким образом, этот подход не будет перезаписывать метод в случае, если он уже существует.

0 голосов
/ 12 февраля 2013

Этот код ActiveRecord был задан в другом вопросе, где он получил отличный ответ. https://stackoverflow.com/a/3473479/420947

Однако упрощенная строка eval здесь устраняет мотивацию для написания этого кода, поэтому она выглядит запутанной. В неизмененном коде привязка блока захватывает локальную переменную, используемую для отражения в ассоциации: #{reflection.name}.clear.

...