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