? :
Rubyで条件演算子()はどのように使用されますか?
たとえば、これは正しいですか?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
? :
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
nil
とfalse
。あまり普通ではありません。
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"
puts (true ? "true" : "false")
括弧付きの小さな編集。それ以外の場合、操作の順序は明確ではありません。私が最初にこれを読んだときのように、私はそれを読んで、私は混乱していた (puts true) ? "true" : "false"
、その後予想puts
その後、文字列値になったブール値を返すように。
ERBの使用は、あなたがRailsにいることを示唆しています。もしそうならtruncate
、あなたのために仕事をする組み込みヘルパーを検討してください:
<% question = truncate(question, :length=>30) %>
@pstは素晴らしい答えを出しましたが、Rubyでは、3項演算子は構文的に正しくなるように1行で記述されています。これは、PerlやCとは異なり、複数の行で記述できるためです。
(true) ? 1 : 0
通常、Rubyを複数行に分割しようとするとエラーが発生しますが、\
行の終わりに行継続記号を使用でき、Rubyは満足します。
(true) \
? 1 \
: 0
これは単純な例ですが、コードを適切にレイアウトしておくため、長い行を処理するときに非常に役立ちます。
演算子を行の最後に置くことで、行連結文字なしで三項を使用することも可能ですが、私はそれが好きではないか、推奨しません。
(true) ?
1 :
0
条件テストや結果が長くなると、コードが読みにくくなると思います。
わかりにくいので三項演算子を使用しないようにとのコメントを読みましたが、それは何かを使用しないのは悪い理由です。同じロジックで、正規表現、範囲演算子( ' ..
'および一見未知の "フリップフロップ"バリエーション)を使用しないでください。正しく使用すると強力なので、正しく使用する方法を学ぶ必要があります。
なぜ括弧を付けたの
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
あまりにもひどいということは簡単に論じられます。
true
ですか?
true
は、は、true
やに評価される式となるもののために実際に座っているからfalse
です。3値ステートメントはすぐに視覚的なノイズに発展し、保守性に影響する可読性を低下させる可能性があるため、視覚的にそれらを区切ることをお勧めします。
オペレーターがプレイヤーのIDが1かどうかを確認し、結果に応じて敵のIDを設定する簡単な例
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
そして、私はかなり役立つと思われるトピックについての投稿を見つけました。
enemy_id = player_id == 1 ? 2 : 1
?
コードcondition ? statement_A : statement_B
は以下と同等です
if condition == true
statement_A
else
statement_B
end
最も簡単な方法:
param_a = 1
param_b = 2
result = param_a === param_b ? 'Same!' : 'Not same!'
以降param_a
に等しくない場合param_b
、その後result
の値がされますNot same!
question=question[0,20]
未満の場合は、変更されません。