82

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

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

object.method ? a.action : nil

else 句を空のままにしますが、最後に nil を指定する必要のない、より慣用的な方法があると思います。(また、この場合、複数行のコードを取り上げるのは無駄だと思います。

4

5 に答える 5

141

原則として、Ruby では三項演算子はほとんど必要ありません。Cでそれが必要な理由は、Cではifステートメントであるため、値を返したい場合は式である三項演算子を使用する必要があるためです。

Ruby では、すべてが式であり、ステートメントないため、三項演算子はほとんど不要です。いつでも交換できます

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 のブール演算子は単にtrueorfalseを返すだけでなく、最後に評価された式の値を返すため、制御フローに使用できます。これは Perl からインポートされたイディオムで、次のようになります。

object.method and a.action
于 2010-02-01T08:17:28.483 に答える
121
a.action if object.method?
于 2010-02-01T03:06:01.667 に答える
18

グレッグの答えは最高ですが、記録のために、そして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には、単一のステートメントまたは式のみが許可される状況はありません...

于 2010-02-01T04:39:56.853 に答える
3

result = (<expression> && <true value>) || <false value>

value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' 説明: value == 1 && 'one' #=> は最後の式の結果を返します。値は 1 に等しいため、セクションが評価され、'one' が返されます。

value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'

説明: 値 != 1 および 'and' 式は評価されませんが、代わりに 'or' 式が使用され、'two' が返されます。

于 2012-08-26T15:25:01.963 に答える