コンテンツにスキップ

配列

配列は、特定の型Tの要素を順序付け、整数でインデックス付けしたジェネリックコレクションです。

配列は通常、角かっこ([])で囲み、個々の要素をカンマ(,)で区切った配列リテラルで作成されます。

[1, 2, 3]

総称型引数

配列の総称型引数Tは、リテラル内の要素の型から推論されます。配列のすべての要素が同じ型の場合、Tはその型と等しくなります。そうでない場合は、すべての要素型の共用体になります。

[1, 2, 3]         # => Array(Int32)
[1, "hello", 'x'] # => Array(Int32 | String | Char)

明示的な型は、閉じかっこ直後にofと型を続けることで指定できます。これは推論された型を上書きし、例えば、最初はいくつかの型のみを保持するが、後で他の型を受け入れることができる配列を作成するために使用できます。

array_of_numbers = [1, 2, 3] of Float64 | Int32 # => Array(Float64 | Int32)
array_of_numbers << 0.5                         # => [1, 2, 3, 0.5]

array_of_int_or_string = [1, 2, 3] of Int32 | String # => Array(Int32 | String)
array_of_int_or_string << "foo"                      # => [1, 2, 3, "foo"]

空の配列リテラルは、常に型指定が必要です。

[] of Int32 # => Array(Int32).new

パーセント配列リテラル

文字列の配列シンボルの配列は、パーセント配列リテラルで作成できます。

%w(one two three) # => ["one", "two", "three"]
%i(one two three) # => [:one, :two, :three]

配列風型リテラル

Crystalは、配列と配列風型に追加のリテラルをサポートしています。これは、型の名前の後に、中かっこ({})で囲まれた要素のリストと、カンマ(,)で区切られた個々の要素で構成されます。

Array{1, 2, 3}

このリテラルは、引数のないコンストラクタを持ち、<<に応答する限り、あらゆる型で使用できます。

IO::Memory{1, 2, 3}
Set{1, 2, 3}

IO::Memoryのような非ジェネリック型の場合、これは以下と同等です。

array_like = IO::Memory.new
array_like << 1
array_like << 2
array_like << 3

`IO::Memory.new << "foo" << "bar" << "baz"`

array_like = Set(typeof(1, 2, 3)).new
array_like << 1
array_like << 2
array_like << 3

Setのようなジェネリック型の場合、ジェネリック型Tは、配列リテラルと同じ方法で要素の型から推論されます。上記は以下と同等です。

Set(Int32){1, 2, 3}

`Set{"foo", "bar", "baz"} # Set(String)`

型引数は、型名の一部として明示的に指定できます。

[1, *coll, 2, 3]
Set{1, *coll, 2, 3}

`Set(Int32){1, 2, 3}`

array = Array(typeof(...)).new
array << 1
array.concat(coll)
array << 2
array << 3

array_like = Set(typeof(...)).new
array_like << 1
coll.each do |elem|
  array_like << elem
end
array_like << 2
array_like << 3

splat展開