2010-12-13 17 views
0

ブロックを使ってすばらしいことを行う方法は、ライブラリの中にあります。さて、私は自分の人生をさらに楽にするためにいくつかの過負荷を作りたいと思っていますが、私がしたいように働かせる方法を理解することはできません。Rubyメソッドの拡張

class ClassNotDefinedByMe 
    def enhanced_awesome_method(&block) 
    if block.arity < 2 
     awesome_method(&block) 
    else 
     # Doing my own extensions here. 
     # This part is not the issue. 
    end 
    end 
end 

ClassNotDefinedByMeはlibにあるので、awesome_method次のとおりです。

は、ここで私がこれまで持っているものです。 awesome_methodはブロックを受け取り、そのブロックに対して0または1のパラメータを持つ意味のあるものを実行します。それ以外の数の引数は、例外を発生させます。私はブロックの2つまたは3つのパラメータを使用する可能性を追加するために上記を書いたが、今はawesome_methodの代わりにenhanced_awesome_methodを呼び出さなければならないことを除いて、すべてうまくいっている。より明確にするため

例(xはClassNotDefinedByMeのインスタンスである):

# These two comes from the library: 
x.awesome_method{  puts "works" } 
x.awesome_method{ |i| puts "also works, the argument is #{i}" } 

# Now I can do this: 
x.enhanced_awesome_method{ |i,j| puts "oh, two arguments! cool." } 
x.enhanced_awesome_method{ |i,j,k| puts "three arguments, how bold!" } 

# But I want to be able to do this: 
x.awesome_method{   puts "still works" } 
x.awesome_method{ |i|  puts "still works" } 
x.awesome_method{ |i,j| puts "still works" } 
x.awesome_method{ |i,j,k| puts "still works" } 

一つは、それがなるように、私は、私の強化方法の新しい名前を使用する必要が良いことだと主張することができそれは別の方法だと分かりますが、私は本当にawesome_methodを私自身のものに置き換えたいと思います。 0と1のパラメータのケースでは動作が同じであり、現在では唯一のものであるため、既存のコードは破られません。

私が実行している問題は、私のメソッドの名前をawesome_methodとし、0または1のパラメータをブロックに渡すと永遠にそれを呼び出すということです。これが継承のケースであれば、私はsuper.awesome_methodと呼んで解決しますが、この場合、クラス自体を変更しただけで何ができますか?

答えて

3

aliasキーワードを使用して元の関数のaliasを作成すると、エイリアス化されたメソッドを呼び出すメソッドをオーバーライドできます。

例:何をしようとする

class ClassNotDefinedByMe 
    alias :old_awesome_method :awesome_method 

    def awesome_method(&block) 
     if block.arity < 2 
      old_awesome_method(&block) 
     else 
      # Awesome stuff here 
     end 
    end 
end 
+0

甘い、魅力的なように働いた。ありがとう! – Jakob

0

method aliasingと呼ばれているが、それは元のメソッドを置き換えるん。