※ カリキュラムでは、Cloud9のターミナルやエディタを利用します。
まだ用意していない方は「AWS Cloud9を準備しよう」を参考に導入してください。
配列のイメージを図で掴もう
まずは「配列とは何か」を図で理解していきましょう。
配列とは
配列とは番号を使って、複数のデータ(オブジェクト)への参照をまとめて管理できるオブジェクトのことです。
変数は、「1つのオブジェクトに結び付ける名札」のような存在だと学びましたね。変数自体はオブジェクトではありませんが、オブジェクトを指し示しています。

それでは、配列を図で確かめてみましょう。
以下の図のように、配列は複数の名札が連結して順番に並べられています。
名札の名前は、0から順番に割り当てられます。

配列は変数が連結して、順番に並べられているものと考えることができます。
配列の要素
配列の中の名札は「要素」と呼ばれます。
Rubyでは、各要素はオブジェクトのことを指し示しています。

要素を特定することで、オブジェクトを参照することができます。要素の特定には、添字(インデックス)を使います。
配列の添字(インデックス)
要素に割り当てられた0からの番号は「添字(インデックス)」と呼ばれます。
各要素を特定するために「添字」が使われます。

配列を使うことで、関連のあるデータへの参照をまとめて管理することができます。
配列は変数に代入できる
配列自体もオブジェクトなので、変数に代入することができます。
配列を変数に代入すると、以下の図のように国の名称のデータを管理する配列に対してcountriesと名付けることができます。

変数に代入したオブジェクトは、変数名を指定することで参照することができましたが、配列を代入した場合は、どのように指定すればよいでしょうか。
以下の図のように変数名(countries)だけでは、配列自体を指していることになり、各要素のオブジェクトを参照することができません。

そこで、要素を特定することができる「添字」の登場です。
変数名に加えて「添字」を指定することで、その要素のオブジェクトが参照できます。

配列のイメージが掴めたところで、次はRubyを使って配列を学ぼう
配列の生成方法を学ぼう
配列オブジェクトの作り方について学んでいきましょう。

配列の生成方法
配列オブジェクトを生成するには、以下のように[]の中に要素の値(オブジェクト)を記述します。,で区切ることで、要素を複数用意することができます。
[]だけの場合は、空の配列オブジェクトが生成されます。
1
[値1, 値2, 値3]
1
[]
以下の図のように,を使って区切ることで、,で区切ったところを要素とした配列オブジェクトが生成されます。

1
["Japan", "France", "Brazil"]
次は手を動かして、実際に配列を生成してみよう
配列を生成してみよう
それでは、[]で配列を生成してみましょう。
irbを起動して、以下のコードを順番に実行しましょう。
1
[]
1
["Japan", "France", "Brazil"]
1
[100, 0, 300, 55]
1
["Japan", 100, "France", 300]
上記をirbで実行すると、以下の画像のように生成された配列が返ります。

次は配列を変数に代入する際の注意点などを確認していきます。
配列を変数に代入
以下のように右辺に配列オブジェクトを指定すると、変数に代入することができます。
1
変数名 = 配列オブジェクト
以下の図のように変数に代入することで、国の名称のデータをまとめて管理する配列にcountriesと名付けることができます。

1
countries = ["Japan", "France", "Brazil"]
配列オブジェクトは、複数の値(オブジェクト)の情報がまとめて管理されているので、変数名は複数形にしましょう。
それでは、配列オブジェクトを変数に代入してみよう
配列を変数に代入してみよう
irbを起動して、変数(countries)に国の名称をまとめた配列を代入してみましょう。
1
countries = ["Japan", "France", "Brazil"]
動画のように変数に代入したら、変数名を使って配列を参照してみましょう。

配列の基本的な使い方を学ぼう
配列の基本的な使い方について学んでいきましょう。
ここからは、Rubyのファイルを使います。
array.rbという名前のファイルを作成して、以下の内容を記述しておきましょう。
※ファイルは「pikawakaフォルダ」の直下に作成しましょう。
1
countries = ["Japan", "France", "Brazil"]
上記をCloud9のエディタに記述すると、警告マークが表示されます。

「定義した変数がエディタ上のどこにも使用されていない」という警告なので、現時点では気にする必要はありません。
それでは、「要素の参照・変更・追加・削除・繰り返し」を順番に学んでいきましょう。
配列の操作には「添字」を理解していることが重要だよ!
たしか最初の要素の添字は0だったよね!
要素の値を参照する
各要素が指し示す値を参照するには、変数名に加えて「添字」が必要でしたね。

変数名のあとに[]で要素の添字を囲むことで、その要素の値を参照できます。
1
配列の変数名[添字]
それでは、最初の要素の値("Japan")を参照してみましょう。
array.rbにハイライト箇所を記述してみましょう。
1
2
3
countries = ["Japan", "France", "Brazil"]
p countries[0]
続いて、動画のようにrubyコマンドでarray.rbのプログラムを実行してみましょう。

プログラムを実行すると、最初の要素の値である"Japan"を出力されましたね。
このように各要素の値を参照するときは、[]と「添字」を使います。
添字を指定する際の注意点
要素に割り当てられる添字は、1ではなく0から始まることに注意しましょう。

2番目の要素の値("France")を参照するには、動画のように添字を2ではなく1に指定します。

また要素としてない存在しない場合は、以下の動画のようにnilが返ります。
nilは、存在しない状態を表す値です。

要素の値を変更する
配列の要素の値を変更するには、以下のように添字を指定して変更したい値を代入します。
1
配列の変数名[添字] = 新しい値
例えば、先ほどのcountriesに代入された配列の"France"を"Germany"に変更したい場合は、以下のように記述します。

1
countries[1] = "Germany"
それでは、2番目の要素の値(France
)を変更してみましょう。
array.rbにハイライト箇所を記述してみましょう。
1
2
3
4
5
6
7
countries = ["Japan", "France", "Brazil"]
p countries[1]
countries[1] = "Germany"
p countries[1]
続いて、動画のようにrubyコマンドでarray.rbのプログラムを実行してみましょう。

2番目の要素の値が"France"から"Germany"に変更されているのが分かりますね。
要素を新しく追加する
配列の中に要素を新しく追加するには、<<か「pushメソッド」を使います。
1
配列オブジェクト << 追加したい値
1
配列オブジェクト.push(追加したい値)
例えば、配列["Red", "Green"]に"Blue"を参照できる要素を追加する場合は、以下のように記述します。
1
2
["Red", "Green"] << "Blue"
# => ["Red", "Green", "Blue"]
1
2
["Red", "Green"].push("Blue")
# => ["Red", "Green", "Blue"]
<<やpushメソッドを使うと、配列の最後に要素が追加されるね
<<やpushメソッドは、配列オブジェクトが代入された変数にも使えます。
1
2
3
4
変数名 = 配列オブジェクト
変数名 << 追加したい値
変数名.push(追加したい値)
先ほどの配列["Red", "Green"]を変数primary_colorsに代入し、要素を新しく追加する場合は、以下のように記述します。
1
2
3
4
5
6
7
primary_colors = ["Red", "Green"]
primary_colors << "Blue"
#=> ["Red", "Green", "Blue"]
primary_colors.push("Yellow")
#=> ["Red", "Green", "Blue", "Yellow"]
複数の要素を新しく追加する場合は、「pushメソッド」が便利です。
1
2
3
4
primary_colors = ["Red", "Green"]
primary_colors.push("Blue", "Yellow")
# => ["Red", "Green", "Blue", "Yellow"]
それでは実際に<<やpushメソッドを使って、配列に要素を新しく追加していこう
要素を新しく追加してみよう
生成した配列に要素を新しく追加します。
<<で"Denmark"を追加し、pushメソッドで"Fiji","Bhutan"を追加します。
以下のコードをarray.rbに記述しましょう。
1
2
3
4
5
6
7
8
9
10
11
countries = ["Japan", "France", "Brazil"]
p countries
countries[1] = "Germany"
p countries
countries << "Denmark"
p countries
countries.push("Fiji", "Bhutan")
p countries
続いて、動画のようにrubyコマンドを使って実行してみましょう。

実行すると、以下の画像のようにターミナルに出力結果が表示されます。

配列に要素を追加した順番で格納されていることがわかります。要素を追加する場合は、<<かpushメソッドを使いましょう。
要素の値を削除する
配列内にある要素の値を削除する場合は、delete_atメソッドを使います。
添字で指定した要素の値が削除されます。
1
配列オブジェクト.delete_at(添字)
以下のようにdelete_atメソッドを使うと、削除された値が返ります。
1
2
["Red", "Green", "Blue", "Yellow"].delete_at(2)
#=> "Blue"
配列を変数に代入した場合も、以下のように要素の値を削除することができます。
1
2
3
4
primary_colors = ["Red", "Green", "Blue", "Yellow"]
primary_colors.delete_at(2)
p primary_colors # => ["Red", "Green", "Yellow"]
配列内の要素の値を削除した場合は、以下のように後にある値が前に詰められます。

"Blue"を削除すると、後にある"Yellow"が前に詰められます。2の添字を割り当てられた要素は"Yellow"を参照することになります。
delete_atメソッドを使うと、配列内の値の添字も変わるので注意しましょう。
それでは、要素の値を削除してみよう
要素の値を削除してみよう
delete_atメソッドで、最初の要素の"Japan"を削除してみます。
以下のコードをarray.rbに記述しましょう。
今回は使わないp countriesが3箇所あるので、コメントアウトしておきましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
countries = ["Japan", "France", "Brazil"]
# p countries
countries[1] = "Germany"
# p countries
countries << "Denmark"
# p countries
countries.push("Fiji", "Bhutan")
p countries
p countries[0]
countries.delete_at(0)
p countries
p countries[0]
続けて、rubyコマンドを使って実行してみましょう。
実行すると、以下の画像のようにターミナルに出力結果が表示されます。

delete_atメソッドによって、配列から"Japan"を削除することができましたね。
countries[0]で参照できる値は、削除する前後で異なるので注意しましょう。
確か値が削除されると、後にある値が前に詰められるんだよね
そうだよ!だから削除後countries[0]は、"Germany"を参照してるんだよ
要素分を繰り返す
配列では、eachメソッドとブロック(do~end)を使うことで、要素分の繰り返し処理が可能になります。
eachメソッドは、配列の要素の値を順番に取り出してブロックの変数に渡します。
ブロックでは、その変数を利用して各要素の値を扱うことができます。
1
2
3
配列オブジェクト.each do |変数|
#繰り返したい処理
end
以下のようにdo~endまでがブロックです。

以下のサンプルコードでは、「要素を3つ持つ配列」に対してeachメソッドを呼び出しています。そのため、ブロック内の処理は「3回」繰り返されることになります。
1
2
3
4
5
6
7
8
9
["Japan", "France", "Brazil"].each do |country|
p country
end
#出力結果
"Japan"
"France"
"Brazil"
#=> ["Japan", "France", "Brazil"]
ブロックの変数(country)には、配列内で最初の要素から順番に渡されます。
そのため、"Japan"から順に出力されています。
少し難しい部分なので、処理の流れを1つ1つ確かめてみよう
eachメソッドとブロックの役割
それでは、以下のサンプルコードの流れを図で1つ1つ説明します。
1
2
3
["Japan", "France", "Brazil"].each do |country|
p country
end
eachメソッドは、配列の要素の値を最初から順番に取り出してブロックに渡します。
最初に配列内の"Japan"を取り出し、countryに渡します。

次に、ブロック内の処理が実行されます。
p countryによって、変数countryの値が出力されます。
このときの変数countryは、eachメソッドから渡された"Japan"を参照します。

配列には要素がまだ存在するので、eachメソッドは次の要素の値("France")を変数countryに渡します。そして、同様にブロック内の処理が実行されます。
このときの変数countryは"Japan"ではなく、"France"を参照します。

このように最後の要素になるまで、処理が繰り返されます。
eachメソッドによって、配列の最初の要素から最後の要素まで順番に値が取り出されます。
そして、ブロックの変数に値を渡すことで、各要素の値に対して同じ処理を行えます。

それでは、実際にeachメソッドとブロックを使ってみよう!
eachメソッドとブロックを使ってみよう
eachメソッドとブロックを使って、配列countriesの要素の値を全て出力させてみます。
以下のコードをarray.rbに記述しましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
countries = ["Japan", "France", "Brazil"]
# p countries
countries[1] = "Germany"
# p countries
countries << "Denmark"
# p countries
countries.push("Fiji", "Bhutan")
# p countries
# p countries[0]
countries.delete_at(0)
p countries
# p countries[0]
countries.each do |country|
p country
end
続けて、rubyコマンドを使ってarray.rbを実行してみましょう。
実行すると、以下の画像のようにターミナルに出力結果が表示されます。

配列countriesの要素の値が最初から最後まで順番に取り出されて、ブロックの変数countryに渡されます。
そして、ブロック内で変数countryを使えば、各要素の値を参照することができます。
配列の応用的な使い方を学ぼう
2次元配列
2次元配列とは、配列の要素に「別の配列」が格納された配列のことです。
配列の要素には、文字列や数値など「あらゆるオブジェクト」を格納することができます。

1
["Japan", 392, 81]
そして、配列もオブジェクトなので配列の要素に格納することができます。

1
["France", "Brazil", ["Japan", 392, 81]]
配列の入れ子が2段階になっている配列を2次元配列と呼びます。入れ子になっていない配列は、2次元配列(多次元配列)と比較して1次元配列と呼ぶことがあります。
比較しない場合、1次元配列のことは単に「配列」と呼ぶよ
2次元配列の要素の値を参照する
2次元配列も変数に代入することができます。
1
countries = ["France", "Brazil", ["Japan", 392, 81]]

ただし、2次元配列の各要素を指定する際には注意が必要です。
"France"や"Brazil"は配列の変数名[添字]だけで参照できますが、入れ子になった各要素の値は参照することができません。
1
2
3
4
5
countries = ["France", "Brazil", ["Japan", 392, 81]]
countries[0] #=>"France"
countries[1] #=>"Brazil"
countries[2] #=>["Japan", 392, 81]
countries[2]では、入れ子になった配列を参照しているだけです。
入れ子の要素に格納される"Japan"は参照されません。

さらに添字を使って、入れ子の要素を特定する必要があります。

入れ子になった要素の値を参照するには、配列の変数名[添字]に加えて入れ子の要素を特定する添字を[]で囲みます。
1
2
3
4
countries = ["France", "Brazil", ["Japan", 392, 81]]
countries[2] #=>["Japan", 392, 81]
countries[2][0] #=>"Japan"
この記事のまとめ
- 配列とは、複数のデータ(オブジェクト)への参照をまとめて管理できるオブジェクトのこと
- 配列内の各要素は、添字を使って特定することができる
- 配列にeachメソッドを呼び出すことで、要素分の繰り返し処理ができる
この記事で学んだことをTwitterに投稿して、アウトプットしよう!
Twitterの投稿画面に遷移します