Ruby を使ったことない人(C が主)が、配列操作に | 演算子を用いている Ruby のコードを見て「……なにしてんの???」と疑問にもち遊んでみたことのまとめです。
準備
array1 = [1, 2, 3]
array2 = ["a", "b", "c"]
num = 255
+演算子で配列の連結
単純に配列同士を連結するには + 演算子が使える
array3 = [111, 111, 111] + array1 + [11, 22, 33] + array2
p array3
[111, 111, 111, 1, 2, 3, 11, 22, 33, "a", "b", "c"]
| 演算子で配列の連結?
| (or)演算子でも配列が連結できる…?
array1 |= array2
p array1
[1, 2, 3, "a", "b", "c"]
| 演算子で要素の追加?
| 演算子で要素が追加できる…?
array1 |= [num]
p array1
[1, 2, 3, "a", "b", "c", 255]
| 演算子で要素の追加!
そんでもってさらに | 演算子で要素が…… 追加できてないね!?
array1 |= [num]
p array1
[1, 2, 3, "a", "b", "c", 255]
+演算子で要素の追加
+演算子だと追加できる……ということは、 | 演算子はあくまで |(or) なのか。
array1 += [num]
p array1
[1, 2, 3, "a", "b", "c", 255, 255]
重複する要素がある配列同士と | 演算子
| 演算子だと array3 の要素の中で、array1 に含まれるものが前方にきて、array1 にないものが後ろに追加される。
そして重複する要素 [111, 111, 111] や [255, 255] はユニークになるのか。
要素の重複をなくしたいときに便利そうだな。
array1 |= array3
p array1
[1, 2, 3, "a", "b", "c", 255, 111, 11, 22, 33]
というか要素の追加時に
array |= [elem]
としていけば、そもそも要素の重複がなくなっていって一石二鳥だね♪というコードだったのか、あれは!
(ここがまとめでもいいくらいの気づき……)
お試し(1): 要素の移動?
ということは……?
array1 = [num] | array1
p array1
[255, 1, 2, 3, "a", "b", "c", 111, 11, 22, 33]
……やっぱり先頭にきた!(予想が当たって嬉しい)
| 演算子による配列操作のまとめ
- 新しく追加しようとした要素に対し配列の中に重複する要素がなければ追加する
- 新しく追加しようとした要素に対し配列の中に重複する要素があれば追加しない
- すでに配列の中に重複する要素がある場合重複が解消される
お試し(2): じゃあ & 演算子は?
↑の結果を踏まえるとそりゃそうか、という感じ。
配列同士で重複する値を取り出したいときとかにいいな。
array1 = [1, 2, 3]
array2 = ["a", "b", "c"]
num = 255
array3 = [111, 111, 111] + array1 + [11, 22, 33] + array2
p array1 & array2
p array3 & array1
p array3 & array2
[]
[1, 2, 3]
["a", "b", "c"]
p array1 & [num]
array1 += [num]
p array1
p array1 & [num]
[]
[1, 2, 3, 255]
[255]
お試し(3): じゃあじゃあ -演算子は??
array1 = [1, 2, 3, 2, 1]
array2 = ["a", "b", "c"]
array2_1 = ["a", "b", "c", 1]
array3 = [111, 111, 111] + array1 + [11, 22, 33] + array2
p array3 - array1
p array3 - array2
p array1 - array2
p array1 - array2_1
[111, 111, 111, 11, 22, 33, "a", "b", "c"] # array3 から array1 が引かれる。
[111, 111, 111, 1, 2, 3, 2, 1, 11, 22, 33] # array3 から array2 が引かれる。
[1, 2, 3, 2, 1] # array1 と array2 には重複する要素がないので
# 何も引かれない。
[2, 3, 2] # array1 と array2_1 の重複する要素[1]だけが
# array1 から引かれる。
1行目、便利!直感的に分かる。便利!
2行目、同上
3行目、array1 だけ残るんだー
4行目、3行目を受けて分からんでもないが「気のまわりすぎる子なのでは?」と思う
気のまわりすぎる子の再確認。
array4 = ["うまい!", "ラーメンショップ", "うまい!"]
p array4
p array4 - ["うまい!"]
p array4 - ["ラーメンショップ"]
["うまい!", "ラーメンショップ", "うまい!"]
["ラーメンショップ"]
["うまい!", "うまい!"]
まあこれは一つ前の 1, 2行目同様、直感的にわかりやすいか。
でもこんな便利な世界に住んでないからびっくりして二度見しちゃった、みたいな感じ。