8

私はこの呼びかけを理解しようとしていました:

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?はまだ利用可能ですが、使用すると警告が発行されますか?これがどのように機能するかを誰かが説明したいですか?

4

1 に答える 1

10

さて、ここで起こることは、プログラマーによって old_method のすべての機能が new_method に移動されたことです。両方の名前が同じ機能を指しているが非推奨に注意するために、プログラマーはdeprecate行を入れます。これにより、<-RUBY ヒアドキュメント ( 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

それが理にかなっていることを願っています

于 2009-06-21T01:01:50.477 に答える