Rubyでは条件演算子(? :
)はどのように使われますか?
例えば、これは正しいですか?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
これは 三項演算子 であり、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
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"
ERBを使用することは、あなたがRailsにいることを示唆しています。もしそうなら、 truncate
、あなたのために仕事をするビルトインヘルパーを考えてください。
<% question = truncate(question, :length=>30) %>
@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
からひどく苦しんでいると主張するのは簡単です。
オペレータがプレイヤーのIDが1かどうかをチェックし、結果に応じて敵のIDを設定する簡単な例
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
そしてこのトピックについて 投稿 を見つけました。これはかなり役に立ちそうです。
これの1つの小さな変形は、ブール値への変換を使用することです。このような演算子
result = !!(condition == true)
コードcondition ? statement_A : statement_B
は、次のコードと同等です。
if condition == true
statement_A
else
statement_B
end