Ruby_Array_24

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

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

インスタンスメソッド

fill(val) -> self
fill {|index| ... } -> self
  • すべての要素にvalをセットする
    • valのコピーでなくval自身をセットする
  • valの代わりにブロックを指定するとブロックの評価結果を値とする
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.fill('foo')
=> ["foo", "foo", "foo"]

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

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

irb(main):002:0> arr.fill('foo')
=> ["foo", "foo", "foo"]

irb(main):003:0> arr[0].capitalize!
=> "Foo"

irb(main):004:0> arr
=> ["Foo", "Foo", "Foo"]
irb(main):001:0> arr = ['a', 'b', 'c']
=> ["a", "b", "c"]

irb(main):002:0> arr.fill {|idx| idx }
=> [0, 1, 2]

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

irb(main):002:0> arr.fill {|idx| 'foo' }
=> ["foo", "foo", "foo"]

irb(main):003:0> arr[0].capitalize!
=> "Foo"

irb(main):004:0> arr
=> ["Foo", "foo", "foo"]

# memo
# valは同一のものがセットされるからcapitalize!ですべての要素に影響があったが、ブロックの場合はそうじゃなく異なるオブジェクトになっている。
fill(val, start, length = nil) -> self
fill(val, range) -> self
fill(start, length = nil) {|index| ... } -> self
fill(range) {|index| ... } -> self
  • 配列の指定された範囲すべてにvalをセットする
    • valのコピーでなくval自身をセットする
    • 範囲の始点が自身の末尾を超えるときには配列の長さを自動的に拡張し、拡張した領域をnilで初期化する
    • 範囲の終点が自身の末尾を超えるときは長さを自動的に拡張し、拡張した部分をvalで初期化する
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.fill('foo', 1, 2)
=> [1, "foo", "foo"]

irb(main):003:0> arr
=> [1, "foo", "foo"]

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

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

irb(main):002:0> arr.fill('foo', 5..10)
=> [1, 2, 3, nil, nil, "foo", "foo", "foo", "foo", "foo", "foo"]

irb(main):003:0> arr
=> [1, 2, 3, nil, nil, "foo", "foo", "foo", "foo", "foo", "foo"]

irb(main):004:0> arr[8].capitalize!
=> "Foo"

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

irb(main):002:0> arr.fill(1, 5) {|idx| 'foo' }
=> [1, "foo", "foo", "foo", "foo", "foo"]

irb(main):003:0> arr
=> [1, "foo", "foo", "foo", "foo", "foo"]

irb(main):004:0> arr[3].capitalize!
=> "Foo"

irb(main):005:0> arr
=> [1, "foo", "foo", "Foo", "foo", "foo"]

# memo
# arr[3]のみがcapitalizeされる
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.fill(5..7) {|idx| 'foo' }
=> [1, 2, 3, nil, nil, "foo", "foo", "foo"]

irb(main):003:0> arr
=> [1, 2, 3, nil, nil, "foo", "foo", "foo"]

irb(main):004:0> arr[6].capitalize!
=> "Foo"

irb(main):005:0> arr
=> [1, 2, 3, nil, nil, "foo", "Foo", "foo"]

# memo
# arr[6]のみがcapitalizeされる

メモ

  • fillはパターンが多いのでパッと見でどういう挙動をするか答えるのが難しそう。
    • ブロックのあるなしで分けられそう。ブロックなしはval、ありは範囲が指定される