0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby の配列を+-|&演算子で遊ぶ

Last updated at Posted at 2019-04-04

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行目同様、直感的にわかりやすいか。
でもこんな便利な世界に住んでないからびっくりして二度見しちゃった、みたいな感じ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?