Arrayクラスを使った配列オブジェクトの作成

配列オブジェクトの元になっているクラスは Array クラスです。 Array クラスのクラスメソッドを使って配列オブジェクトを作成することもできます。ここでは Ruby で Array クラスのクラスメソッドを使って配列オブジェクトを作成する方法について解説します。

(2021 年 06 月 30 日公開 / 2022 年 10 月 12 日更新)

Array[item,...]

1 つ目はクラスメソッドの [] を使用した形式です。最初のページで使用した配列オブジェクトの作り方は今回の形式で Array を省略したものと考えることが出来ます。

Array[item,...]

オブジェクトをカンマ(,)で区切って指定します。指定したオブジェクトの数だけの要素を持つ配列オブジェクトが作成され、各要素には引数に指定したオブジェクトが順に代入されます。

具体的には次の様に記述します。

ary = Array[2005, 2006, 2007, 2008]

4つの要素を持ち、それぞれ数値オブジェクトが代入された配列オブジェクトが作成されます。

Array.new([size[, val]])

2 つ目はクラスメソッドの new を使用した形式です。

ary.new([size[, val]])

作成する要素数だけを指定します。要素数を省略した場合は空の配列オブジェクトが作成されます。

具体的には次の様に記述します。

ary1 = Array.new(3)
ary2 = Array.new

要素数だけを指定した場合、各要素には初期値としてのオブジェクトが代入されていませんので nil が代入されます。よって次のように配列オブジェクトを作成した場合と同じです。

ary = [nil, nil, nil]

また要素に代入するオブジェクトを指定することも可能です。

ary = Array.new(3, "Red")

指定した要素数の数だけ要素を作成すると同時に、各要素に 2 番目に指定したオブジェクトを代入します。この形式で配列を作成した場合、各要素には全て同一のオブジェクトが代入されますので注意が必要です。次の例を見てください。

ary1 = ["Red", "Red", "Red"]
ary2 = Array.new(3, "Red")

最初の例では、各要素には「Red」と言う文字列オブジェクトが各要素に代入されます。これらのオブジェクトは値は「Red」で同じですがオブジェクトとしては全て別のオブジェクトです。

それに対して 2 つ目の例では「Red」と言う文字列オブジェクトが 1 つだけ作成され全ての要素に代入されます。各要素は同じオブジェクトを参照していることになります。よって文字列オブジェクトを何らかの方法で変更するとすべての要素が参照しているオブジェクトに影響が出ます。

別々のオブジェクトを作成して要素に格納したい場合には次のブロック付きメソッドを利用して下さい。

Array.new(size) {|index| ... }

3 つ目はブロック付きのクラスメソッドの new を使用した場合です。

Array.new(size) {|index| ... }

作成する要素数を指定します。そしてブロック内で各要素に対して代入するオブジェクトを作成するための処理を記述します。

具体的には次の様に記述します。

ary = Array.new(3){"Red"}

この場合、要素数が 3 つの配列オブジェクトが作成されますが、各要素に対してブロック内の処理が呼び出されて実行されます。今回は単に文字列オブジェクトの「Red」を記述しています。この場合は各要素に「Red」が格納されますが、要素毎に毎回オブジェクトが作成されて代入されているため各要素には値は同じですが別々の文字列オブジェクトが代入されます。

Array.new(ary)

4 つ目はクラスメソッドの new の引数に他の配列オブジェクト指定した場合です。

Array.new(ary)

引数に指定した配列オブジェクトが複製された配列オブジェクトが作成されます。この時、元になっている配列オブジェクトと複製された配列オブジェクトの同じ位置にある要素は、同じオブジェクトを参照しています。

具体的には次の様に記述します。

ary = ["Red", "Red"]
newary = Array.new(ary)

上記の場合、配列オブジェクト「array」の 0 番目の要素と 1 番目の要素に代入されているオブジェクトは別々のものでが、複製された配列オブジェクト「newarray」の 0 番目の要素に代入されているオブジェクトは、元の配列オブジェクト「array」の0番目の要素に代入されているオブジェクトは同一です。

配列オブジェクトの作成はここまでのいずれかの方法で行いますが、作成と同時にオブジェクトを要素に代入する方法を使う場合は、同じオブジェクトなのか別のオブジェクトなのかは注意して使用して下さい。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

ary1 = Array["Red", "Red"]
puts('Array["Red", "Red"]')
puts(ary1[0].object_id)
puts(ary1[1].object_id)

ary2 = Array.new(2, "Red")

puts('Array.new(2, "Red")')
puts(ary2[0].object_id)
puts(ary2[1].object_id)

ary3 = Array.new(2){"Red"}

puts('Array.new(2){"Red"}')
puts(ary3[0].object_id)
puts(ary3[1].object_id)

ary4 = Array.new(array1)

puts('Array.new(array1)')
puts(ary4[0].object_id)
puts(ary4[1].object_id)

下記のように実行して下さい。

Arrayクラス

Array.new(2, "Red") で作成した配列オブジェクトは、 2 つの要素に代入されているオブジェクトが同じです。また Array.new(array1) で作成したオブジェクトは元になっている配列オブジェクトと、対応する要素に代入されているオブジェクトが同じです。

-- --

Ruby で Array クラスのクラスメソッドを使って配列オブジェクトを作成する方法について解説しました。

( Written by Tatsuo Ikura )

広告
Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。