Rubyのor
演算子と||
演算子の違いは何ですか?それとも単に好みですか?
演算子の優先順位の問題です。
||
は、or
よりも優先順位が高くなっています。
したがって、2つの間には、3項(? :
)や代入(=
)などの他の演算子があり、どちらを選択するとステートメントの結果に影響を与えることができます。
Ruby演算子の優先順位テーブル です。
and
/&&
を使用した別の例については、 この質問 を参照してください。
また、発生する可能性があるいくつかの厄介なことに注意してください。
a = false || true #=> true
a #=> true
a = false or true #=> true
a #=> false
前の2つのステートメントは両方ともtrue
に評価されますが、2番目は=
優先順位が||
より低いがa
より高いため、false
をor
に設定します。
他の人がすでに説明したように、onlyの違いが優先です。ただし、実際には2つの間にtwoの違いがあることを指摘したいと思います。
and
、or
、およびnot
は、much&&
、||
、および!
よりも優先順位が低いand
とor
の優先順位は同じで、&&
の優先順位は||
よりも高いです一般的に、and
、or
、およびnot
の使用を避け、代わりに&&
、||
、および!
を使用するのが良いスタイルです。 (たとえば、Railsコア開発者は、演算子フォームの代わりにキーワードフォームを使用するパッチを拒否します。)
それらが存在する理由は、ブール式ではなく、制御フローのためです。彼らは、Perlの有名なdo_this or do_that
イディオムを介してRubyに入りました。ここで、do_this
はfalse
またはエラーがある場合はnil
を返しますその場合のみはdo_that
が代わりに実行されます。 (類似、do_this and then_do_that
イディオムもあります。)
例:
download_file_via_fast_connection or download_via_slow_connection
download_latest_currency_rates and store_them_in_the_cache
これにより、制御フローがif
またはunless
を使用するよりも少し流になる場合があります。
この場合、演算子が「間違った」(つまり同一の)優先順位を持っている理由は簡単にわかります。とにかく同じ式で一緒に表示されることはありません。そしてdoが一緒に現れると、一般的にwant単純に左から右に評価されます。
および/または制御フロー用です。
Rubyはこれを有効な構文として許可しません。
false || raise "Error"
ただし、これは有効です。
false or raise "Error"
最初の作業は()で行うことができますが、or
を使用するのが正しい方法です。
false || (raise "Error")
puts false or true
->出力:false
puts false || true
->出力:true
これらの演算子の使用方法:
||, &&
はブール論理用です。 or, and
は制御フロー用です。例えば。
do_smth if may_be || may_be
-ここで条件を評価します
do_smth or do_smth_else
-ワークフローを定義します。これはdo_smth_else unless do_smth
と同等です
簡単な例を挙げます:
> puts "a" && "b" b
> puts 'a' and 'b' a
Railsでよく知られているイディオムはrender and return
です。 return if render
とは言えませんが、render && return
は機能しません(Rails documentation を参照)
または||と同じではありません
||のみを使用or演算子の代わりの演算子。
理由:
「または」と「||」の両方いずれかのオペランドがtrueの場合、trueと評価されます。最初のオペランドが偽の場合にのみ、2番目のオペランドを評価します。
「and」と同様に、「or」と「||」の唯一の違い優先順位です。
人生を面白くするために、「and」と「or」の優先順位は同じですが、「&&」の優先順位は「||」よりも高くなっています。