配列¶
配列は、特定の型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展開¶