Ruby_Array_12

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

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

インスタンスメソッド

collect -> Enumerator
map -> Enumerator
collect {|item| ... } -> [object]
map {|item| ... } -> [object]
  • 各要素に対してブロックを評価した結果を全て含む配列を返す
  • ブロックを省略した場合、上で説明した繰り返しを実行し、その結果として得られる配列を返すようなEnumerator
irb(main):001:0> [1, 2, 3].map {|v| v * 2 }
=> [2, 4, 6]
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> brr = arr.map { 1 }
=> [1, 1, 1]

irb(main):003:0> arr[1] = 'a'
=> "a"

irb(main):004:0> arr
=> [1, "a", 3]

irb(main):005:0> brr
=> [1, 1, 1]
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> brr = arr.map
=> #<Enumerator: [1, 2, 3]:map>

irb(main):003:0> brr.each { 1 }
=> [1, 1, 1]

irb(main):004:0> arr
=> [1, 2, 3]

irb(main):005:0> brr
=> #<Enumerator: [1, 2, 3]:map>

irb(main):006:0> arr[1] = 'a'
=> "a"

irb(main):007:0> arr
=> [1, "a", 3]

irb(main):008:0> brr
=> #<Enumerator: [1, "a", 3]:map>

irb(main):009:0> brr.each {|v| puts v }
1
a
3
=> [nil, nil, nil]

# memo
# ブロック省略の挙動は初めて知った。使うときはいつもブロックを指定していたので。
# どういうときに使うのだろう?
# 元の配列に破壊的変更を加えたときに影響を受けるのは覚えておきたい
collect! {|item| ..} -> self
map! {|item| ..} -> self
collect! -> Enumerator
map! -> Enumerator
  • 各要素を順番にブロックに渡して評価し、その結果で要素を置き換える
  • ブロックが与えられなかった場合は、自身とmap!から生成したEnumeratorオブジェクトを返す
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.map! {|v| v * 2 }
=> [2, 4, 6]

irb(main):003:0> arr
=> [2, 4, 6]
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> brr = arr.map! { 1 }
=> [1, 1, 1]

irb(main):003:0> arr[1] = 'a'
=> "a"

irb(main):004:0> arr
=> [1, "a", 1]

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

irb(main):006:0> arr.equal?(brr)
=> true

# memo
# 要素を置き換えているので、arrとbrrは同一オブジェクトになっている
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> brr = arr.map!
=> #<Enumerator: [1, 2, 3]:map!>

irb(main):003:0> brr.each { 1 }
=> [1, 1, 1]

irb(main):004:0> arr
=> [1, 1, 1]

irb(main):005:0> brr
=> #<Enumerator: [1, 1, 1]:map!>

irb(main):006:0> arr[1] = 'a'
=> "a"

irb(main):007:0> arr
=> [1, "a", 1]

irb(main):008:0> brr
=> #<Enumerator: [1, "a", 1]:map!>

# memo
# ブロック省略の挙動は初めて知った。使うときはいつもブロックを指定していたので。
# どういうときに使うのだろう?
# 元の配列に破壊的変更を加えたときに影響を受けるのは覚えておきたい

メモ

  • ブロック指定なしの挙動は覚えておきたい