Как работает этот устаревший метод? - PullRequest
8 голосов
/ 21 июня 2009

Я пытался понять этот вызов:

deprecate :new_record?, :new?

, который использует этот метод устаревания:

   def deprecate(old_method, new_method)
      class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def #{old_method}(*args, &block)
          warn "\#{self.class}##{old_method} is deprecated," + 
                "use \#{self.class}##{new_method} instead"
          send(#{new_method.inspect}, *args, &block)
        end
      RUBY
    end

Я не очень понимаю метапрограммирование, которое здесь используется. Но разве это просто еще один способ наложения псевдонима на метод new_record? - так что, по сути, new_record? все еще доступен, но выдает предупреждение при его использовании? Кто-нибудь хотел бы объяснить, как это работает?

1 Ответ

10 голосов
/ 21 июня 2009

хорошо, так что здесь происходит то, что все функции old_method были перенесены программистом в new_method. Чтобы оба имени указывали на одну и ту же функциональность, но отмечали устаревание, программист вставляет строку deprecate. Это приводит к тому, что строка, указанная в heredoc <-RUBY (<a href="http://en.wikipedia.org/wiki/Heredoc" rel="nofollow noreferrer">http://en.wikipedia.org/wiki/Heredoc)), интерпретируется как код (оцениваемый) на уровне класса.

Код выглядит примерно так (если бы мы расширили метапрограммирование)

class SomeClass
  def new?; true; end

  deprecate :new_record?, :new? # this generates the following code

  def new_record?(*args, &block)
    warn "SomeClass#new_record? is deprecated," + 
            "use SomeClass#new? instead"
    send(:new?, *args, &block)
  end
end

Надеюсь, это имеет смысл

...