Ruby_Array_7

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

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

インスタンスメソッド

self[range] = val
  • Rangeオブジェクトrangeの範囲にある要素を配列valの内容に置換する
    • range範囲内の要素をそれぞれvalで置き換えるのではなく、まるっとvalで置き換える
  • rangeのfirstが自身の末尾を越えるとき、配列の長さを自動的に拡張して拡張した領域をnilで初期化する
  • rangeのfirstやendの値が負のときには、末尾からのインデックスとみなす
  • rangeのfirstがendより後にある場合には、firstの直前にvalを挿入する
  • valはrangeの範囲に設定したい要素を配列で指定する
    • 配列以外のオブジェクトを指定した場合はto_aryメソッドによる暗黙の型変換を試みる
    • to_aryメソッドに応答できない場合は[val]を用いる
  • valの要素の数の方がrangeの長さより大きいとき、後ろの要素がずれる
  • valが空配列ならstartからendまでの要素が削除される
  • 指定された範囲の始点が自身の始点よりも前にある場合はRangeError
irb(main):001:0> [1, 2, 3, 4, 5][1..2]
=> [2, 3]

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

irb(main):003:0> arr[1..2] = 'z'
=> "z"

irb(main):004:0> arr
=> [1, "z", 4, 5]
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> arr[7..10] = 'z'
=> "z"

irb(main):003:0> arr
=> [1, 2, 3, 4, 5, nil, nil, "z"]
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> arr[-2..10] = 'z'
=> "z"

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

irb(main):002:0> arr[2..0] = 'z'
=> "z"

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

irb(main):002:0> arr[1..2] = ['x', 'y', 'z']
=> ["x", "y", "z"]

irb(main):003:0> arr
=> [1, "x", "y", "z", 4, 5]

# memo
# [1, ["x", "y", "z"], 4, 5] ではない
irb(main):001:0> arr = [1, 2, 3, 4]
=> [1, 2, 3, 4]

irb(main):002:0> arr[1..2] = ['a', 'b', 'c', 'd', 'e', 'f']
=> ["a", "b", "c", "d", "e", "f"]

irb(main):003:0> arr
=> [1, "a", "b", "c", "d", "e", "f", 4]
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:1> arr[1..3] = []
=> []

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

irb(main):002:0> arr[-6..-3] = 'z'
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):2:in `<main>'
        1: from (irb):2:in `[]='
RangeError (-6..-3 out of range)

メモ

  • valは配列ではないオブジェクトを指定するのだと思っていた