Rubyの「|」「&」「||」「&&」の違い

f:id:ryoutaku_jo:20190716022323p:plain

【結論】

・「||」「&&」は、論理演算子と呼ばれ、条件式で論理積(AND)や論理和(OR)を指定する際に用いられる

・「|」「&」は、Integerクラス(数値)ではビット演算子、Arrayクラス(配列)では集合の演算子として機能する

・「|」「&」はオーバーライド可能だが、「||」「&&」はオーバーライド出来ない。

【目次】

【本題】

「|」「&」「||」「&&」について

Ruby演算子「|」「&」「||」「&&」は、それぞれ役割が異なります。

今回は、それぞれの機能についてまとめます。

論理演算子「||」「&&」

「||」「&&」は、論理演算子と呼ばれ、条件式で論理積(AND)や論理和(OR)を指定する際に用いられます

#「&&」は全ての式が真だとtrue
1 == 1 && 2 == 2
=> true

1 == 1 && 2 == 3
=> false

#「||」はいずれかの式が真だとtrue
1 == 1 || 2 == 2
=> true

1 == 1 || 2 == 3
=> true

1 == 2 || 2 == 3
=> false

なお、論理演算子においては左辺で結果が確定している場合、右辺は評価されません。

「||」の場合、左辺が真であれば結果は確定します。

「&&」の場合、左辺が偽であれば結果が確定します

これらの場合、仮に右辺が例外の発生する様な式だとしても、評価されてないのでエラーは出なくなります。

オブジェクトによって動きの変わる「|」「&」

「|」「&」は使用するオブジェクトのクラスによって動きが変わります。

Integerクラス(数値)の場合、ビット演算子となります

#「|」は論理和を返します
10 | 3
=> 11

#「&」は論理積を返します
10 & 3
=> 2

Arrayクラス(配列)の場合は、集合の演算子となります。

a = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]

b = [2,4,6]
=> [2, 4, 6, 8, 10]

#「&」はいずれにも含まれる値を返します
a & b
=> [2, 4, 6]

#「||」はいずれかに含まれる値を返します
a | b
=> [1, 2, 3, 4, 5, 6, 8, 10]

「||」「&&」はオーバーライド不可

「|」「&」演算子として機能していますが、オブジェクトによって動きを変える使用上、実際にはメソッドとして定義されています。

その為、「|」「&」はオーバーライド(再定義)する事が可能となっています。

しかし、「||」「&&」は演算子として定義されている為、オーバーライド(再定義)出来ない仕様となっています。

参考情報

Ruby | 再定義できる演算子 で組み込み演算子風のメソッドを定義する #ruby - Qiita

ビット演算入門 - Qiita

《今日の学習進捗(3年以内に10000時間に向けて)》

明日のRubysilver受験に向けて勉強中。

学習開始からの期間 :220日
今日までの合計時間:2114h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:2009h
目標との解離:105h
「10,000時間」まで、

残り・・・「7886時間!」