I`veには、以下のRubyのクラスを得た:コール追加パラメータを持つブロック内のすべてのメソッド
class Sandwich
class << self
def prepare_with(special_ingredient, &block)
# Some very very special magic is done here to
# call instead just .fry! as .fry!({:ingredient=>special_ingredient})
# and for any other method the same
end
def fry!(opts= {})
end
def add_mayo(opts = {})
end
end
end
class Hamburger < Sandwich
end
=> Hamburger.prepare_with(bacon) do
=> Hamburger.fry!
=> Hamburger.add_mayo
=> end
私はHamburger
クラスのすべてのメソッドを呼び出すの変更と最後のパラメータのハッシュに追加key=>value
を追加します。
いくつかの特別な魔法が.fry!({:ingredient=>special_ingredient})
としてcall
だけではなく、.fry!
のように、すべてのサンドイッチの方法(およびそのすべての子孫)を呼び出すことSandwich.prepare_with
で行う必要があります。
EDITED:
=> Hamburger.prepare_with(bacon) do
=> Hamburger.fry!
=> h = Hash.new("Go fish")
=> Hamburger.add_mayo
=> end
:理想的に私たちはたとえば次のコードのために、内部のブロックコードの呼び出しをフィルタリングするために必要な追加点は、それは追加のパラメータを指定して呼び出すことdoesnの `tのフィルタ方法を任意のprepare_withコードの例外を発生させます
が、これはあなたが –
を探していたものであるなら、私に知らせてあなたが意味するか私の答えを編集しましたHash.newはエラーをスローするはずですか? –
私は本当にあなたの編集を理解しているのか分かりませんが、私はそれが第二の問題であり、この問題は解決しにくいと思います。ここでDSLを構築しようとしているのであれば、おそらく外部のDSLを使うべきでしょう。独自のパーサーを構築するか、treetopやraccを使用して、これを実現できます。次に、未知のステートメントが発生した場合に例外を発生させることができます。 –