2009-06-21 4 views
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?メソッドのエイリアシングのもう1つの方法です - 実際にはnew_record?は使用できますが、使用すると警告が表示されますか?誰でもこの仕組みを説明したいですか?

答えて

10

ここでは、old_methodのすべての機能がプログラマによってnew_methodに移動されたことがあります。両方の名前を同じ機能を指すようにするには、非推奨に注意してください。プログラマはdeprecate行に入れます。これにより、< -RUBY heredoc(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 

私はそれが意味

+0

はい、感謝します願っています。それは理にかなっている。私はまだ得られないただ1つのこと - この構文:<< - RUBY、__FILE__、__LINE__ + 1 "<< - RUBY"がヘレドックを開始する場合、残りの部分は何ですか?この部分:__FILE__、__LINE__ + 1 – Hola

+0

定義を "deprecate"から "alias_method:new_record ?,:new?"に変更した場合、警告メッセージは表示されません。 – Hola

+0

私の知る限りでは、はい。 __FILE__と__LINE__情報は、class_evalのオプションの位置決め引数です。それらがなくて例外が発生した場合、バックトレースは '(eval):3 new_record?'のようなものを含みます。 __FILE__は現在のソースファイルであり、__LINE__は現在の行番号です。したがって、失敗した場合、バックトレースはeval文が定義された場所を示します。 –

関連する問題