web-dev-qa-db-ja.com

Ruby他にない三項演算子

単純なコマンドとして、「If do-this」および「do-this」のRubyイディオムはありますか?

たとえば、私は現在やっています

object.method ? a.action : nil

else句を空のままにしておきますが、最後にnilを指定する必要のない、もっと慣用的な方法がおそらくあると思います。 (あるいは、この場合、複数行のコードを使用するのは無駄だと感じます。

73
RyanCacophony
a.action if object.method?
111
Greg Campbell

一般的なルールとして、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
136
Jörg W Mittag

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では、単一のステートメントまたは式のみが許可される状況はありません...

16
DigitalRoss

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」を返します

2
omakoleg

同じ行でこれを行う別の方法は次のとおりです。

if object.method; a.action end

これは、式を終了するためにセミコロンを使用するため、Rubocopによって悪いスタイルと見なされますが、最後のifステートメントを追加するよりも、いくつかの条件で読みやすくなります。最後のifステートメントを見落とすのは簡単ですし、条件がtrueでない場合(三項演算子で強制されているため)常に何かを返したくありません。

あなたはもう少し冗長で、rubocopに優しいこともできます:

if object.method then a.action end
1
Allison