Ruby 配列(Array)

Ruby の配列は、任意のオブジェクトの順序付けられた整数インデックス付きコレクションです。配列の各要素はインデックスに関連付けられており、インデックスから取得できます。

配列のインデックスは 0 から始まります。これは C や Java と同じです。負のインデックスは配列の末尾からの相対位置として数えられます。つまり、インデックスが -1 なら配列の最後の要素、-2 なら配列の最後から2番目の要素を表し、以下同様です。

Ruby の配列は、String、Integer、Fixnum、Hash、Symbol などのオブジェクトを格納でき、さらには他の Array オブジェクトも格納できます。

Ruby の配列はサイズを指定する必要がなく、要素を追加すると自動的に拡張されます。

配列の作成

配列を作成または初期化する方法は複数あります。1つの方法はnewクラスメソッド:

names = Array.new

配列の作成と同時にサイズを設定できます:

names = Array.new(20)

配列namesのサイズ(長さ)は20要素です。size または length メソッドを使用して配列のサイズを取得できます:

例

#!/usr/bin/ruby names = Array.new(20) puts names.size #20 を返す puts names.length #20 を返す

試してみる »

上記の例を実行した出力結果は次のとおりです:

20
20

配列の各要素に値を代入するには、次のようにします:

例

#!/usr/bin/ruby names = Array.new(4, "mac") puts "#{names}"

試してみる »

上記の例を実行した出力結果は次のとおりです:

["mac", "mac", "mac", "mac"]

new を伴うブロックを使用することもできます。各要素はブロック内の計算結果で埋められます:

例

#!/usr/bin/ruby nums = Array.new(10) { |e| e = e * 2 } puts "#{nums}"

試してみる »

上記の例を実行した出力結果は次のとおりです:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

配列にはもう1つの方法 [] もあります。次のようにします:

nums = Array.[](1, 2, 3, 4,5)

配列作成の別の形式は次のとおりです:

nums = Array[1, 2, 3, 4,5]

Ruby のコアモジュールには、単一の引数だけを受け取る Array メソッドがあります。このメソッドは範囲を引数として使用して数値配列を作成します:

例

#!/usr/bin/ruby digits = Array(0..9) puts "#{digits}"

上記の例を実行した出力結果は次のとおりです:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

配列の組み込みメソッド

Array メソッドを呼び出すには、Array オブジェクトのインスタンスが必要です。Array オブジェクトのインスタンスを作成する方法は次のとおりです:

Array.[](...) [or] Array[...] [or] [...]

これにより、指定されたオブジェクトで埋められた新しい配列が返されます。作成したオブジェクトを使用して、利用可能な任意のメソッドを呼び出すことができます。例:

例

#!/usr/bin/ruby digits = Array(0..9) num = digits.at(6) puts "#{num}"

上記の例を実行した出力結果は次のとおりです:

6

以下は公開されている配列メソッドです(arrayが Array オブジェクトであると仮定):

番号メソッド & 説明
1array & other_array
2つの配列に共通する要素を重複なしで含む新しい配列を返します。
2array * int [or] array * str
self を int 回連結した新しい配列を返します。String 引数を渡すと、self.join(str) と同じになります。
3array + other_array
2つの配列を連結して作られる新しい配列を返します。
4array - other_array
元の配列から other_array に含まれる要素を削除した新しい配列のコピーを返します。
5str <=> other_str
str を other_str と比較し、-1(小さい)、0(等しい)、または 1(大きい)を返します。比較は大文字と小文字を区別します。
6array | other_array
other_array を array に追加し、重複を除去して新しい配列を返します。
7array << obj
指定されたオブジェクトを配列の末尾に追加します。この式は配列自体を返すため、複数の追加を連鎖できます。
8array <=> other_array
配列が other_array より小さい、等しい、または大きい場合、整数(-1、0、+1)を返します。
9array == other_array
2つの配列が同じ数の要素を含み、各要素がもう一方の配列の対応する要素と等しい場合(Object.== に基づく)、その2つの配列は等しくなります。
10array[index] [or] array[start, length] [or]
array[range] [or] array.slice(index) [or]
array.slice(start, length) [or] array.slice(range)

インデックスがindexの要素、またはstartから始まりlength個の要素のサブ配列、またはrangeで指定されたサブ配列を返します。負のインデックスは配列の末尾から数えます(-1 は最後の要素)。もしindex(または開始インデックス)が範囲外の場合はnil。
11array[index] = obj [or]
array[start, length] = obj or an_array or nil [or]
array[range] = obj or an_array or nil

nil を返します。indexインデックスがstartの要素を設定する、またはlengthから始まるrange個の要素のサブ配列を置き換える、またはlengthで指定されたサブ配列を置き換えます。インデックスが配列の現在の容量より大きい場合、配列は自動的に拡張されます。負のインデックスは配列の末尾から数えます。もしnilがゼロの場合は要素を挿入します。2番目または3番目の形式でselfが使用された場合は、
12array.abbrev(pattern = nil)
ためにselfから要素を削除します。
13array.assoc(obj)
self 内の文字列について、明確な省略形の集合を計算します。パターンまたは文字列が渡された場合、そのパターンに一致するか、その文字列で始まる場合のみが考慮されます。nil。
14array.at(index)
要素も配列である配列を検索し、obj.== を使用して obj を各要素(配列)の最初の要素と比較します。一致した場合は、最初に一致した配列を返し、一致するものがない場合はselfインデックスが index の要素を返します。負のインデックスは
15array.clear
の末尾から数えます。インデックスが範囲外の場合は nil を返します。
16array.collect { |item| block } [or]
array.map { |item| block }

ためにself配列からすべての要素を削除します。blockself 内の各要素に対してブロックを一度呼び出し
17array.collect! { |item| block } [or]
array.map! { |item| block }

ためにself。ブロックが返す値を含む新しい配列を作成します。blockself 内の各要素に対してブロックを一度呼び出しblock、要素を
18array.compact
が返す値に置き換えます。self返すのはnilのコピーで、すべての
19array.compact!
要素を削除したものです。nil配列からすべてのnil。
20array.concat(other_array)
nil 要素を削除します。変更がない場合は nil を返します。selfother_array の要素を
21array.delete(obj) [or]
array.delete(obj) { block }

からselfself に追加します。objから等しいnil項目を削除します。等しい項目が見つからない場合はblocknil を返します。等しい項目が見つからず、オプションのコードblockが与えられた場合は
22array.delete_at(index)
の結果を返します。index指定されたnil。
23array.delete_if { |item| block }
当 block位置の要素を削除し、その要素を返します。index が範囲外の場合はselfが true の場合、削除します
24array.each { |item| block }
ためにselfself 内の各要素に対してブロックを一度呼び出しblock、その要素を引数として渡します。
25array.each_index { |index| block }
Array#each と同じですが、要素のindexインデックスを渡し、要素そのものは渡しません。
26array.empty?
配列自体が要素を含まない場合、true を返します。
27array.eql?(other)
もしarrayとotherが同じオブジェクトであるか、2つの配列が同じ内容であれば、true を返します。
28array.fetch(index) [or]
array.fetch(index, default) [or]
array.fetch(index) { |index| block }

位置indexの要素を返そうとします。もしindexが配列の範囲外の場合、最初の形式はIndexError例外を発生させ、2番目の形式はdefaultデフォルト値を返し、3番目の形式はblockブロックを呼び出してindexインデックスを渡した結果の値を返します。負のindexインデックスは配列の末尾から数えます。
29array.fill(obj) [or]
array.fill(obj, start [, length]) [or]
array.fill(obj, range) [or]
array.fill { |index| block } [or]
array.fill(start [, length] ) { |index| block } [or]
array.fill(range) { |index| block }

最初の3つの形式はselfself の選択された要素をobjobj に設定します。開始がnilnil の場合はゼロと同等です。nilnil の長さはself.length配列の長さと同等です。最後の3つの形式は、ブロックの値で配列を埋めます。blockブロックには、埋められる各要素の絶対インデックスが渡されます。
30array.first [or]
array.first(n)

配列の最初の要素、または先頭のn個の要素を返します。配列が空の場合、最初の形式はnilnil を返し、2番目の形式は空の配列を返します。
31array.flatten
再帰的に平坦化された1次元の新しい配列を返します。
32array.flatten!
をarray平坦化を実行します。変化がない場合はnilnil を返します。(配列がサブ配列を含まない場合。)
33array.frozen?
もしarrayが凍結されている場合(またはソート中に一時的に凍結されている場合)は true を返します。
34array.hash
配列のハッシュコードを計算します。同じ内容の配列は同じハッシュコードを持ちます。
35array.include?(obj)
もしselfの中にobjが含まれている場合は true を返し、それ以外の場合は false を返します。
36array.index(obj)
返すのはself配列内で obj と等しい最初のオブジェクトのindexインデックスです。一致するものが見つからない場合は nil を返します。nil。
37array.indexes(i1, i2, ... iN) [or]
array.indices(i1, i2, ... iN)

このメソッドは Ruby の最新バージョンで非推奨になったため、Array#values_at を使用してください。
38array.indices(i1, i2, ... iN) [or]
array.indexes(i1, i2, ... iN)

このメソッドは Ruby の最新バージョンで非推奨になったため、Array#values_at を使用してください。
39array.insert(index, obj...)
指定されたindexインデックスの要素の前に、指定された値を挿入します。index は負の値でもかまいません。
40array.inspect
配列の印刷可能なバージョンを作成します。
41array.join(sep=$,)
文字列を返します。配列の各要素を文字列に変換し、sep区切り文字を使用して作成します。
42array.last [or] array.last(n)
返しますselfの最後の要素。配列が空の場合、最初の形式はnil。
43array.length
返しますself内の要素の数。ゼロの場合もあります。
44array.map { |item| block } [or]
array.collect { |item| block }

ためにselfの各要素に対して1回呼び出しますblock。block が返す値を含む新しい配列を作成します。
45array.map! { |item| block } [or]
array.collect! { |item| block }

ためにarrayの各要素に対して1回呼び出し、block要素を block が返す値に置き換えます。
46array.nitems
返しますself内の non-nil 要素の数。ゼロの場合もあります。
47array.pack(aTemplateString)
aTemplateString のディレクティブに従って、配列の内容をバイナリシーケンスにパックします。ディレクティブ A、a、Z の後には、結果のフィールド幅を表す数値を続けることができます。残りのディレクティブには、変換する配列要素の数を表す数値を付けることもできます。数値がアスタリスク(*)の場合、残りのすべての配列要素が変換されます。任意のディレクティブの後にアンダースコア(_)を続けることができ、指定された型に対して基盤プラットフォームのネイティブサイズを使用することを示します。それ以外の場合は、プラットフォームに依存しない一貫したサイズが使用されます。テンプレート文字列内のスペースは無視されます。
48array.pop
からarrayから最後の要素を削除し、その要素を返します。arrayが空の場合は nil を返します。nil。
49array.push(obj, ...)
指定された obj を配列の末尾に追加します。この式は配列自体を返すため、複数の追加を連結できます。
50array.rassoc(key)
要素も配列である配列を検索し、== を使用してkeyを各包含配列の2番目の要素と比較します。一致する場合は、最初の包含配列を返します。
51array.reject { |item| block }
block が true でない場合の配列項目を含む新しい配列を返します。
52array.reject! { |item| block }
block が真の場合、arrayから要素を削除し、変更がない場合は nil を返しますnil。Array#delete_if と同等です。
53array.replace(other_array)
をarrayの内容をother_arrayの内容で置き換え、必要に応じて切り詰めたり拡張したりします。
54array.reverse
逆順に並べた配列要素を含む新しい配列を返します。
55array.reverse!
をarrayを逆順にします。
56array.reverse_each {|item| block }
Array#each と同じですが、arrayを逆順にします。
57array.rindex(obj)
array 内で obj と等しい最後のオブジェクトのインデックスを返します。一致するものが見つからない場合は、nil。
58array.select {|item| block }
配列から連続する要素を渡して block を呼び出し、block が返すtrue値が true の場合の要素を含む配列を返します。
59array.shift
返しますselfの最初の要素を返し、その要素を削除します(他のすべての要素を1つ前に移動します)。配列が空の場合は、nil。
60array.size
nil を返します。arrayの長さ(要素の数)。length のエイリアスです。
61array.slice(index) [or] array.slice(start, length) [or]
array.slice(range) [or] array[index] [or]
array[start, length] [or] array[range]

インデックスがindexの要素、またはstartから始まってlength個の要素までの部分配列、またはrangeで指定された部分配列を返します。負のインデックスは配列の末尾から数えます(-1 は最後の要素)。もしindex(または開始インデックス)が範囲外の場合は nil を返します。nil。
62array.slice!(index) [or] array.slice!(start, length) [or]
array.slice!(range)

削除しますindex(長さはオプション)またはrangeで指定された要素。削除されたオブジェクト、部分配列を返します。indexが範囲外の場合は nil を返します。nil。
63array.sort [or] array.sort { | a,b | block }
並べ替えられた配列を返します。
64array.sort! [or] array.sort! { | a,b | block }
配列を並べ替えます。
65array.to_a
返しますself。もしArrayのサブクラスで呼び出された場合、レシーバーを Array オブジェクトに変換します。
66array.to_ary
self を返します。
67array.to_s
self.join を返します。
68array.transpose
self が配列の配列であると仮定し、行と列を転置します。
69array.uniq
新しい配列を返します。array内の重複する値を削除したものです。
70array.uniq!
からselfから重複する要素を削除します。変更がない場合(つまり、重複が見つからなかった場合)は nil を返します。nil。
71array.unshift(obj, ...)
オブジェクトを配列の先頭に追加し、他の要素を1つ後ろに移動します。
72array.values_at(selector,...)
self 内の指定されたselector(1つまたは複数)に対応する要素を含む配列を返します。セレクターは整数インデックスまたは範囲にすることができます。
73array.zip(arg, ...) [or]
array.zip(arg, ...){ | arr | block }

任意の引数を配列に変換し、次にarrayの要素を各引数の対応する要素と結合します。

配列 pack ディレクティブ

以下の表は、メソッド Array#pack のパックディレクティブを示しています。

ディレクティブ説明
@絶対位置に移動します。
AASCII 文字列(スペースで埋める。count は幅)。
aASCII 文字列(null で埋める。count は幅)。
Bビット文字列(降順)
bビット文字列(昇順)。
C符号なし文字。
c文字。
D, d倍精度浮動小数点数、ネイティブ形式。
E倍精度浮動小数点数、リトルエンディアンバイト順。
e単精度浮動小数点数、リトルエンディアンバイト順。
F, f単精度浮動小数点数、ネイティブ形式。
G倍精度浮動小数点数、ネットワーク(ビッグエンディアン)バイト順。
g単精度浮動小数点数、ネットワーク(ビッグエンディアン)バイト順。
H16進文字列(上位ニブル優先)。
h16進文字列(下位ニブル優先)。
I符号なし整数。
i整数。
L符号なし long。
lLong。
Mquoted-printable、MIME エンコーディング。
mBase64 エンコードされた文字列。
NLong、ネットワーク(ビッグエンディアン)バイト順。
nShort、ネットワーク(ビッグエンディアン)バイト順。
P構造体へのポインタ(固定長文字列)。
pヌル終端文字列へのポインタ。
Q, q64ビット数値。
S符号なし short。
sShort。
UUTF-8。
uUU エンコードされた文字列。
VLong、リトルエンディアンバイト順。
vShort、リトルエンディアンバイト順。
wBER 圧縮整数 \fnm。
X1バイト後方にスキップします。
xNull バイト。
Za と同じですが、null が * で追加されます。

例

次の例を試して、さまざまなデータをパックしてください。

例

a = [ "a", "b", "c" ] n = [ 65, 66, 67 ] puts a.pack("A3A3A3") #=> "a b c " puts a.pack("a3a3a3") #=> "a\000\000b\000\000c\000\000" puts n.pack("ccc") #=> "ABC"

上記の例の実行出力結果は次のとおりです。

a  b  c
abc
ABC
その他の拡張