Ruby_Array_8

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

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

インスタンスメソッド

self[start, length] = val
  • インデックスstartからlength個の要素を配列valの内容で置き換える
  • startが自身の末尾を超えるとき、配列の長さを自動的に拡張して拡張した領域をnilで初期化する
  • startの値が負のときには末尾からのインデックスとみなす
  • startに整数以外のオブジェクトを指定した場合はto_intメソッドによる暗黙の型変換を試みる
  • lengthの値が0のときはstartの直前にvalを挿入する
  • valに配列以外のオブジェクトを指定した場合はto_aryメソッドによる暗黙の型変換を試みる
    • to_aryメソッドに応答できない場合は[val]を用いる
  • valの長さがlengthと等しくない場合、valの長さに合わせて要素が削除されたりずれたりする
  • valが空配列ならstartからendまでの要素が削除される
  • start、lengthに整数以外の(暗黙の型変換が行えない)オブジェクトを指定した場合、またvalに配列以外の(暗黙の型変換が行えない)オブジェクトを指定した場合にTypeErrorが発生する
  • startが自身の始点よりも前を指している場合、またlengthに負の数を指定した場合にIndexErrorが発生する
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

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

irb(main):003:0> arr
=> [1, "a", "b", 5]

# memo
# idx=1,2,3の要素が削除されて'a','b'が挿入されている
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> arr[10, 5] = ['a', 'b']
=> ["a", "b"]

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

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

irb(main):003:0> arr
=> ["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]

# memo
# lengthが0なので、startの直前にvalが挿入されている
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> arr[2, 2] = []
=> []

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

irb(main):002:0> arr['1', 1] = '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):6:in `<main>'
        1: from (irb):6:in `[]='
TypeError (no implicit conversion of String into Integer)

irb(main):003:0> arr[1, '1'] = 'z'
Traceback (most recent call last):
        6: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>'
        5: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load'
        4: 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)>'
        3: from (irb):6:in `<main>'
        2: from (irb):7:in `rescue in <main>'
        1: from (irb):7:in `[]='
TypeError (no implicit conversion of String into Integer)
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> arr[-10, 20] = '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 `[]='
IndexError (index -10 too small for array; minimum: -5)
irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

irb(main):002:0> arr[1, -1] = '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):4:in `<main>'
        1: from (irb):4:in `[]='
IndexError (negative length (-1))