Ruby の OR とダブルパイプ演算子の違い

Nurudeen Ibrahim 2022年4月18日
Ruby の OR とダブルパイプ演算子の違い

or および||どちらも Ruby の論理演算子です。それらは同様の動作のために混乱する可能性があります。それらの間にはわずかな違いしかありません。このチュートリアルでは、それらがどのように異なり、それぞれがどのように使用されるかを見ていきます。

覚えておくべき重要なことの 1つは、他の演算子を含まない式に表示された場合も同じように動作することです。それ以外の場合は、動作が異なります。

他のオペレーターが関与していない場合

この分類では、2つの演算子は同じように動作し、最初の真の値を返します。

サンプルコード:

nil or 5
2 or 4

出力:

5
2

サンプルコード:

nil || 5
2 || 4

出力:

5
2

上記の例では、コードはステートメントではなく表現の形式であることに注意してください。それをステートメントにするものを組み合わせると、予期しない結果が生じます。

たとえば、nil or 5 は、メソッドへの引数として、または変数に割り当てることができる式ですが、puts nil or 5 は、それ自体が完全なステートメントです。

Ruby 式をテストする最良の方法は、インタラクティブ Ruby IRB を使用することです。macOS にプリインストールされています。IRB でテストするには、以下の手順に従ってください。

  • ターミナルを開きます。
  • irb と入力し、Enterを押します。プロンプトが表示されます。
  • 式を入力します(例:nil || 5Enterを押します。
  • 式の結果は次の行に表示されます。

他のオペレーターが関与している場合

以下の例のコードを評価した後、a の値に焦点を当てます。

サンプルコード:

a = nil or 5
b = 2 or 4
puts a
puts b

出力:

nil
2

サンプルコード:

a = nil || 5
b = 2 || 4
puts a
puts b

出力:

5
2

上記の動作を説明する最良の方法は、Ruby 演算子優先順位テーブルを調べることです。上記の例のように、式が複数の演算子で構成されている場合は常に、それらの優先順位に基づいてそれらを評価する必要があります。

この表は、= 演算子の優先順位がまたは演算子よりも高いが、|| 演算子よりは低いことを示しています。したがって、例の評価の順序は、次のように分類できます。

(a = nil) or 5
(b = 2) or 4
a = (nil || 5)
b = (2 || 4)

上記の例では = 演算子を使用することにしましたが、or より高く、||より低い任意の演算子を使用できます。同じ動作をします。例は+= です。

サンプルコード:

a = 1
a += 2 || 4    # a += (2 || 4)
puts a

出力:

3

サンプルコード:

a = 1
a += 2 or 4      # (a += 2) or 4
puts a

出力:

3

サンプルコード:

a = 1
a += nil || 5      # a += (nil || 5)
puts a

出力:

6

サンプルコード:

a = 1
a += nil or 5      # (a += nil) or 5

Ruby は最初に角かっこ内の式を評価し、anil ずつインクリメントしようとするため、TypeError (nil can't be coerced into Integer) をスローします。

関連記事 - Ruby Operator