2017-05-10 8 views
0

この質問は、厳密にはについてのものです。簡潔には、は、さまざまな量の "ハッシュ化された"引数を持つメソッドを呼び出します。メソッド呼び出しのオプションのキー/値

背景

私はこの方法を持っている:

def meth(a, b, c={}) 
... 
end 

私は通常、このようにそれを呼び出す:

meth(123, 456, arg1: 234, arg2: 543) 

メソッドの定義はどのような方法、フォームやファッションで変更すべきではありません。

問題

は、今私は、特定の条件がfalseの場合args: 543をスキップしたいです。

擬似コードではなく、有効なルビー:

meth(123, 456, arg1: 234, cond ? (arg2: 543) :()) 

は、メソッド定義を変更したり、monkeypatchingせずに、このの構文を理解することは非常に、エレガントに短いかつ簡単にありますか?私のようなものになるだろう

明白な解決策を試してみました何

...

args = { arg1: 234 } 
args[:arg2] = 543 if cond 
meth(123, 456, args) 

あまりにも醜いです。

meth(123, 456, {arg1: 234}.merge(cond ? {arg2: 543} : {})) 

実際にコードが少し長くなると、最初のグレースで100%読めるわけではありません。

私は***オペレータで遊んでみましたが、それ以上の見た目の解決策は見つかりませんでした。

+1

「あまりにも醜い」 - それは行く方法です。 –

+0

'meth(123,456、arg1:234、arg2:(cond)if))'は有効なルビーですが、あなたの最後の試みはより良いと思います。 – Ilya

+0

@AndreyDeinekoら:私は感想を感謝します。この質問は一般的なプログラミングのパラダイムではなく、非常に具体的なものであり、私は非常に明確な問題と考えています。私は「カチンカの法律」を認識していますが、質問の無効性を私に納得させる必要はありません。どのような良いアイデアが上がるかわからない! – AnoE

答えて

2

私はugly解決策をとるべきだと思います。コードのスマート性よりもシンプルさと可読性を重視する必要があります。

は、あなたがこのような何かを行うことができ、あなたの元の質問に答えるために:

args = { arg1: 234, arg2: (543 if cond) } 
meth(123, 456, args) 
+0

私の答えはシンプルさと読みやすさについてです。私は何をしたいのか簡単で読みやすい解決策があるかどうかを尋ねています。私はRubyのかなり深く、何も考えることはできません。この質問を「最後の呼び出し」のように扱います。 ;)あなたが与えた解決策は、私がbtwを必要としない場合、 'arg2:nil'で終わります。パラメータハッシュにキー "arg2"が出現しないようにする必要があります。 – AnoE

0

私は第三引数に必要な条件を実行メソッド呼び出しになるだろう。

meth(123, 457, check_cond(234, 543, object-that-contains-conditionals-data)); 

これは、はるかに明確で、他の選択肢よりもきれいです。

関連する問題