web-dev-qa-db-ja.com

Rubyで条件演算子(?:)を使うにはどうすればいいですか?

Rubyでは条件演算子(? :)はどのように使われますか?

例えば、これは正しいですか?

<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
283

これは 三項演算子 であり、Cの場合と同様に機能します(括弧は不要です)。これは次のように機能する式です。

if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this

しかし、Rubyでは、ifも式です。if a then b else c end === a ? b : c、優先順位の問題を除いて。どちらも式です。

例:

puts (if 1 then 2 else 3 end) # => 2

puts 1 ? 2 : 3                # => 2

x = if 1 then 2 else 3 end
puts x                        # => 2

最初の場合は括弧が必要です(そうでなければRubyはputs if 1の後に余分なジャンクがあると思われるので混乱します)が、最後のケースではこれらの問題は発生しないので必要ありません。

複数行で読みやすくするために "long-if"形式を使用できます。

question = if question.size > 20 then
  question.slice(0, 20) + "..."
else 
  question
end
462
user166390
puts true ? "true" : "false"
=> "true"


puts false ? "true" : "false"
=> "false"
32
DGM

ERBを使用することは、あなたがRailsにいることを示唆しています。もしそうなら、 truncate 、あなたのために仕事をするビルトインヘルパーを考えてください。

<% question = truncate(question, :length=>30) %>
25
Wayne Conrad

@pstがすばらしい答えを出してくれましたが、Rubyでは、3項演算子が構文的に正しいように1行に書かれていることに言及したいのです。

(true) ? 1 : 0

通常、Rubyはそれを複数の行に分割しようとするとエラーを発生させますが、行末に\行継続記号を使用することができ、Rubyは幸せでしょう:

(true)   \
  ? 1    \
  : 0

これは簡単な例ですが、コードがうまくレイアウトされているため、長い行を扱う場合に非常に役立ちます。

演算子を行の最後に置くことで、行継続文字を使わずに3進数を使用することもできますが、私はそれを好きではないか、お勧めしません。

(true) ?
  1 :
  0

私は条件付きテストや結果が長くなるにつれてコードを読むのが本当に難しくなると思います。

混乱を招くので、3項演算子を使用しないようにというコメントを読みましたが、それが何かを使用しないのは悪い理由です。同じ論理で、正規表現や範囲演算子( '..'と一見未知の "フリップフロップ"のバリエーション)を使うべきではありません。それらは正しく使用されたとき強力です、従って私達はそれらを正しく使用することを学ぶべきです。


なぜtrueを括弧で囲んだのですか?

OPの例を考えてみましょう。

<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>

条件付きテストをラップすると、テストが視覚的に分離されるため、読みやすくなります。

<% question = (question.size > 20) ? question.question.slice(0, 20)+"..." : question.question %>

もちろん、空白をいくつか慎重に追加することで、例全体をもっと読みやすくすることができます。これはテストされていませんが、あなたはアイデアを得るでしょう:

<% question = (question.size > 20) ? question.question.slice(0, 20) + "..." \
                                   : question.question 
%>

あるいは、もっと慣用的に書いたもの:

<% question = if (question.size > 20)
                question.question.slice(0, 20) + "..."
              else 
                question.question 
              end
%>

読みやすさもquestion.questionからひどく苦しんでいると主張するのは簡単です。

17
the Tin Man

オペレータがプレイヤーのIDが1かどうかをチェックし、結果に応じて敵のIDを設定する簡単な例

player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2

そしてこのトピックについて 投稿 を見つけました。これはかなり役に立ちそうです。

3
devwanderer

これの1つの小さな変形は、ブール値への変換を使用することです。このような演算子

result = !!(condition == true)
0
jcpennypincher

コードcondition ? statement_A : statement_Bは、次のコードと同等です。

if condition == true
  statement_A
else
  statement_B
end
0
Umesh Malhotra