ブロックを使ってすばらしいことを行う方法は、ライブラリの中にあります。さて、私は自分の人生をさらに楽にするためにいくつかの過負荷を作りたいと思っていますが、私がしたいように働かせる方法を理解することはできません。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
と呼んで解決しますが、この場合、クラス自体を変更しただけで何ができますか?
甘い、魅力的なように働いた。ありがとう! – Jakob