単純なコマンドとして、「If do-this」および「do-this」のRubyイディオムはありますか?
たとえば、私は現在やっています
object.method ? a.action : nil
else句を空のままにしておきますが、最後にnilを指定する必要のない、もっと慣用的な方法がおそらくあると思います。 (あるいは、この場合、複数行のコードを使用するのは無駄だと感じます。
a.action if object.method?
一般的なルールとして、Rubyでは三項演算子はほとんど必要ありません。 Cで必要な理由は、Cではif
がステートメントであるため、値を返す場合はhaveの三項演算子(式)を使用するためです。 。
Rubyでは、everythingは式であり、そこにはareステートメントがありません。これにより、三項演算子はほとんど不要になります。いつでも交換できます
cond ? then_branch : else_branch
と
if cond then then_branch else else_branch end
したがって、あなたの例では:
object.method ? a.action : nil
に等しい
if object.method then a.action end
@Greg Campbellが指摘しているように、これは末尾のif
修飾子形式と同等です。
a.action if object.method
また、Rubyのブール演算子は、true
またはfalse
を返すだけでなく、最後に評価された式の値を返すため、制御フローに使用できます。 。これはPerlからインポートされたイディオムで、次のようになります。
object.method and a.action
Gregの答えは最高ですが、記録に関しては、C言語よりもさらに、Rubyの式とステートメントは同等なので、a.action if o.m?
次のようなこともできます。
object.method? && a.action
あなたは書ける (a; b; c) if d
あるいは
(a
b
c
) if d
またはそのことについて:(x; y; z) ? (a; b c) : (d; e; f)
Rubyでは、単一のステートメントまたは式のみが許可される状況はありません...
result = (<expression> && <true value>) || <false value>
value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one'
説明:value == 1 && 'one'#=>は最後の式の結果を返し、valueは1に等しいため、セクションが評価され、 'one'を返します。
value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'
説明:値!= 1および「and」式は評価されませんが、instadaは「or」式を使用し、「two」を返します
同じ行でこれを行う別の方法は次のとおりです。
if object.method; a.action end
これは、式を終了するためにセミコロンを使用するため、Rubocopによって悪いスタイルと見なされますが、最後のifステートメントを追加するよりも、いくつかの条件で読みやすくなります。最後のifステートメントを見落とすのは簡単ですし、条件がtrueでない場合(三項演算子で強制されているため)常に何かを返したくありません。
あなたはもう少し冗長で、rubocopに優しいこともできます:
if object.method then a.action end