Ruby_Array_3

この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。

class Array (Ruby 3.0.0 リファレンスマニュアル)

インスタンスメソッド

self + other -> Array
  • 自身とotherの内容をつなげた配列を生成して返す
  • otherに配列以外のオブジェクトを指定した場合はto_aryメソッドによる暗黙の型変換を試みる
    • to_aryメソッドとは?後で調べる
irb(main):001:0> [1, 3] + [2, 4]
=> [1, 3, 2, 4]
irb(main):001:0> a = ['foo', 'bar']
=> ["foo", "bar"]

irb(main):002:0> b = ['yes', 'no']
=> ["yes", "no"]

irb(main):003:0> c = a + b
=> ["foo", "bar", "yes", "no"]

irb(main):004:0> c[1].capitalize!
=> "Bar"

irb(main):005:0> a
=> ["foo", "Bar"]

irb(main):006:0> b
=> ["yes", "no"]

irb(main):007:0> c
=> ["foo", "Bar", "yes", "no"]

# memo
# aの内容も変わる。
# 逆にa, bの要素をcapitalize!したときもcの内容は変わる。
irb(main):001:0> a = ['a', 'b']
=> ["a", "b"]

irb(main):002:1> b = ['c']
=> ["c"]

irb(main):003:0> c = a + b
=> ["a", "b", "c"]

irb(main):004:0> a[1] = 'z'
=> "z"

irb(main):005:0> a
=> ["a", "z"]

irb(main):006:0> b
=> ["c"]

irb(main):007:0> c
=> ["a", "b", "c"]

# memo
# a[1]もc[1]も'b'を参照している状態から、a[1]の参照を'z'に変えただけなのでc[1]に変化はない
irb(main):001:0> [1, 2, 3] + true
Traceback (most recent call last):
        5: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>'
        4: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load'
        3: from /Users/mfham/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
        2: from (irb):1:in `<main>'
        1: from (irb):1:in `+'
TypeError (no implicit conversion of true into Array)
self - other -> Array
  • 自身からotherの要素を取り除いた配列を生成して返す
    • 要素の同一性はObject#eql?で評価
    • self中で重複していてother中に存在しない要素はその重複が保持される
      • self & other の挙動とごっちゃにならないように
irb(main):001:0> [1, 2, 1, 3, 1, 4] - [4, 2] 
=> [1, 1, 3, 1]

# memo
# otherに1が含まれていないため、selfの1の重複は保持されている
irb(main):001:0> [1, 2, 1, 3, 1, 4] - [1, 4]
=> [2, 3]

irb(main):002:0> [4, 1, 3, 1, 2, 1] - [1, 4]
=> [3, 2]

# memo
# selfの1は重複分すべて取り除かれている。
# 生成される要素の順はselfの順
irb(main):001:0> ['a', 'b', 'A', 'B'] - ['b']
=> ["a", "A", "B"]

# memo
# 'b'.eql?('b') #=> true
# 'b'.eql?('B') #=> false
irb(main):001:0> a = ['a', 'b', 'c']
=> ["a", "b", "c"]

irb(main):002:0> b = ['b']
=> ["b"]

irb(main):003:0> c = a - b
=> ["a", "c"]

irb(main):004:0> a[2].capitalize!
=> "C"
irb(main):005:0> a
=> ["a", "b", "C"]

irb(main):006:0> b
=> ["b"]

irb(main):007:0> c
=> ["a", "C"]
irb(main):001:0> a = ['a', 'b', 'c']
=> ["a", "b", "c"]

irb(main):002:0> b = ['b']
=> ["b"]

irb(main):003:0> c = a - b
=> ["a", "c"]

irb(main):004:0> a[0] = 'z'
=> "z"

irb(main):005:0> a
=> ["z", "b", "c"]

irb(main):006:0> b
=> ["b"]

irb(main):007:0> c
=> ["a", "c"]
irb(main):001:0> [1, 2, 3] - 1
Traceback (most recent call last):
        5: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>'
        4: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load'
        3: from /Users/mfham/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
        2: from (irb):1:in `<main>'
        1: from (irb):1:in `-'
TypeError (no implicit conversion of Integer into Array)