次のコードを実行するとどうなりますか
a = [1, 2, 5, 7, 8]
b = [1, 3, 6, 7, 9]
c = nil || a & b | a && a | b
p c
演算子の優先順位とそれぞれの演算子について理解していないと解けない問題。
###積集合「&」
重複している要素は取り除かれ、共通する要素を取り出す。
a = [1, 2, 3]
b = [1, 3, 5]
a & b #=> [1, 3]
###&&演算子
&&は a と b がどちらも真のとき、最後に評価された b を出力する
a && b #=> [1, 3, 5]
###和集合「|」
重複している要素は取り除かれ、重複している要素をまとめて出力する。
a = [1, 2, 3]
b = [1, 3, 5]
a | b #=> [1, 2, 3, 5]
###||演算子
||は a と b がどちらかが真のとき、最初に評価された a を出力する
a = [1, 2, 3]
b = [1, 3, 5]
a || b #=> [1, 2, 3]
a = nilの場合右辺の処理が行われる
a || b #=> [1, 3, 5]
上記の知識を踏まえて考えてみる
a = [1, 2, 5, 7, 8]
b = [1, 3, 6, 7, 9]
c = nil || a & b | a && a | b
p c
####⑴優先順位を考える
演算子の優先順位
高い
&
|
&&
||
低い
####⑵優先順位の順番に処理を考える
-
1番初めに評価するもの【積集合(共通している要素を取り出す)】
c = nil || a & b | a && a | b
a & b の場合は共通する要素を取り出す=>[1, 7]
-
2番目に評価するもの【和集合(重複している要素を全て取り出す)】
c = nil || ①(a & b | a) && ②(a | b)
c = nil || [1, 7] | a && a | b
①[1, 7] | a
=>[1, 7] | [1, 2, 5, 7, 8]
=>[1, 7, 2, 5, 8]
②a|b
=>[1, 2, 5, 7, 8, 3, 6, 9]
-
3番目に評価するもの【&&演算子】
c = nil || a & b | a && a | b
[1, 3, 7, 2, 5, 8]
|[1, 2, 5, 7, 8, 3, 6, 9]
どちらも真の場合最後に評価された値を返す =>[1, 2, 5, 7, 8, 3, 6, 9]
-
4番目に評価するもの【||演算子】
nil || [1, 2, 5, 7, 8, 3, 6, 9]
左辺がnilの場合は右辺の処理が行われる
#回答
[1, 2, 5, 7, 8, 3, 6, 9]
#感想
難しい!
参考資料:
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html