6

三項条件演算子の賢明な使用が好きです。私の考えでは、それは非常に簡潔です。

ただし、ルビーでは、すでに独自の疑問符が付いている述語メソッドをテストしていることがよくあります。

some_method( x.predicate? ? foo : bar )

私はこれらの2つの疑問符が非常に接近していることに悩まされています。同等にコンパクトで読みやすい代替手段はありますか?

4

4 に答える 4

12

Cで条件演算子が必要な理由は、条件ステートメントがステートメントであるためです。つまり、値を返さない(そして返すことができない)ためです。したがって、条件付きコードから値を返したい場合は、運が悪いことになります。そのため、条件演算子を追加する必要がありました。これは式です。つまり、値を返します。

ただし、Rubyでは、とにかくRubyであるステートメントがないため、条件演算子は完全に不要です。すべてが表現です。具体的にはif、Rubyにはステートメントはなく、if式のみがあります。

とにかく式なのでif、不可解な条件演算子の代わりに使用できます。

some_method( if x.predicate? then foo else bar end )

覚えておく必要があるのは、述語を改行、セミコロン、またはのいずれかで終了する必要があるということだけですthen。だから、あなたがこれをする最初の3回、あなたは向きを変えます

if cond
  foo
else
  bar
end

の中へ

if cond foo else bar end

なぜそれが機能しないのか疑問に思います。しかしその後、then(またはセミコロン)は自然に来ます:

if cond; foo else bar end
if cond then foo else bar end
于 2010-07-12T19:47:01.580 に答える
9

あなたが得ることができる最も近い簡潔な表現は

x.predicate? && foo || bar

これは一種の三項演算子として機能しますが、より不可解で醜いです。

query?これは、メソッドの糖分によって引き起こされる統語論的糖尿病の単なる事例です。私たちはそれと一緒に暮らすことを学ぶ必要があると思います。

于 2010-07-12T19:58:14.333 に答える
3

スペースを削除するだけです。

some_method( x.predicate?? foo : bar )

Rubyでも同様に有効です。それを試してみてください!

于 2012-05-16T00:09:51.890 に答える
1

簡単だとは言えませんが、多くの場合、述語自体を次のように括弧で囲むだけで便利な場合があります。

some_method((x.predicate?) ? foo : bar )

これは、特に述語がそれほど単純でない場合に役立ちますmethod?

于 2016-03-16T15:26:09.057 に答える