なぜ私はルビーがand
、or
よりも優先度が低く、&&
,||
、および代入演算子ですか?何か理由はありますか?Rubyに "and"、 "or"演算子の後ろに知恵はありますか?
答えて
私の推測は、Perlからの直接のキャリーオーバーです。オペレータor
とand
は、あとでPerl 5で特定の状況で追加されました。
try to perform big long hairy complicated action || die ;
をして
||
は、アクションの一部を飲み込んするつもりではなかったことを確認してください。たとえば
は、Perlで、ここで我々は書くことができるように||
は、低い優先順位を持っていたことを望みます。 Perl 5はor
を導入しました。新しいバージョンの||
は、この目的のために優先度が低くなりました。
あなたがor
なく||
を使用することができRubyでの例:
value = possibly_false or raise "foo"
あなたが||
を使用した場合、それは構文エラーになります。
オペレータの優先順位を制御できることは、特に可読性に懸念がある場合に便利です。条件付きステートメントの余分な括弧は、実際のロジックを不明瞭にすることがあります。
Rubyがブール演算子の優先レベルを持つ理由は、Rubyを書く前にMatzがPerlプログラマーであったことが主な原因であると考えています。そして、多くの主要な構文と演算子を借用しています。その言語。
ええと、それはなぜルビーがとても未成熟で、同時に非常に肥大しているのかを説明します。それでも私の頭を包み込むのはまだ難しいです。 – akostadinov
これらは非常に低い優先度を持つため、オペランドをかっこで囲む必要はありません。&&
と||
の場合があります。
私は、具体的には代入演算子の下にそれらを置くことを考えているので、代入を使って論理テストを書くことはできますが、括弧は付けません。
違いが優先です。 ||
,&&
は、=
より高い優先度を有するが、and
,or
が低い。あなたが行うことができながら、だから:
a = nil || 0
あなたがしなければならないでしょう:
a = (nil or 0)
を同じ効果を得るために。あなたがしている場合:
a = nil or 0
結果はまだ0ですが、値はnilになります。
do_somethingやdieのイディオムの名前はありますか?それはルビーで使用されますか? –
私はそれの名前は知らないが、Rubyではかなり一般的だ。 – Chuck
Perlは、dieに大きく傾きますが、Rubyはraiseを使用します。例外の利点は、あなたがそれを救うことができることです。 – tadman