Ruby_Array_1

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

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

継承

Array < Enumerable < Object < Kernel < BasicObject
dynamic include: JSON::Generator::GeneratorMethods::Array (by json)
特異メソッド
self[*item] -> Array
  • itemを要素として持つ配列を生成し、返す
irb(main):001:0> arr = Array[1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.class
=> Array
irb(main):001:0> class SubArray < Array
irb(main):002:0> end
=> nil

irb(main):003:0> sub_arr = SubArray[1, 2, 3]
=> [1, 2, 3]

irb(main):004:0> sub_arr.class
=> SubArray

# memo
# この特異メソッドは、上記のようにサブクラスのインスタンスを生成しやすくするために用意されているみたいだ。
new(size = 0, val = nil) -> Array
  • 長さsizeの配列を生成し、各要素をvalで初期化し、返す
  • 全要素が同じオブジェクトvalを参照
irb(main):001:0> Array.new
=> []
irb(main):001:0> arr = Array.new(3)
=> [nil, nil, nil]

irb(main):002:0> arr.class
=> Array
irb(main):001:0> Array.new(3, 'foo')
=> ["foo", "foo", "foo"]
irb(main):001:0> arr = Array.new(3, 'foo')
=> ["foo", "foo", "foo"]

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

irb(main):003:0> arr
=> ["Foo", "Foo", "Foo"]
irb(main):001:0> arr = Array.new(3, 'foo')
=> ["foo", "foo", "foo"]

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

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

# memo
# よく考えればわかるけど、arr[0]とarr[2]は"bar"にならない。
new(ary) -> Array
  • 指定された配列(ary)を複製して返す
    • 要素を複製しない浅い複製
irb(main):001:0> Array.new([1,2,3])
=> [1, 2, 3]
irb(main):001:0> a = ['a', 'b', 'c']
=> ["a", "b", "c"]

irb(main):002:0> b = Array.new(a)
=> ["a", "b", "c"]

irb(main):003:0> a[1].capitalize!
=> "B"

irb(main):004:0> a
=> ["a", "B", "c"]

irb(main):005:0> b
=> ["a", "B", "c"]

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

irb(main):007:0> a
=> ["a", "z", "c"]

irb(main):008:0> b
=> ["a", "B", "c"]
new(size) {|index| ... } -> Array
  • 長さsizeの配列を生成、要素のインデックスを引数としてブロックを実行、各要素の値をブロックの評価結果に設定し、返す
  • ブロックは要素ごとに実行されるので、全要素をあるオブジェクトの複製にすることが可能
irb(main):001:0> Array.new(3){|index| "hoge#{index}"}
=> ["hoge0", "hoge1", "hoge2"]
irb(main):001:0> arr = Array.new(3){ "foo" }
=> ["foo", "foo", "foo"]

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

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

# memo
# arr[0]とarr[2]は"Foo"にならない。
try_convert(obj) -> Array | nil
  • to_aryメソッドを用いてobjを配列に変換しようとする
    • 変換できないときはnilを返す
    • to_aryメソッドって何?後で調べる
  • 引数が配列であるかどうか調べるときに使える
irb(main):001:0> Array.try_convert([1])
=> [1]
irb(main):001:0> Array.try_convert('1')
=> nil
irb(main):001:0> class SubArray < Array
irb(main):002:0> end
=> nil

irb(main):003:0> sub_arr = SubArray.new
=> []

irb(main):004:0> sub_arr.class
=> SubArray

irb(main):005:0> puts 'yes' if Array.try_convert(sub_arr)
yes
=> nil

メモ

  • try_convertを初めて知った
  • new(ary)はどういうときに活用するのだろう?
  • ドキュメントで使われている変数名、arrじゃなくてary