陣列 Array

陣列(Array)為一以整數為索引之有序泛型集合(Generic collection),其中包含型別為 T 的元素。

通常我們可以使用中括號([])表達一個陣列常值,並用逗號(,)分隔內部的元素:

[1, 2, 3]

泛型型別參數

陣列的泛型型別參數 T 會從元素中推導得出,如果所有的元素都屬於同一種型別,那麼 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]

類・陣列(Array-like)型別常值

Crystal 亦對類・陣列的型別提供以大括號({})的方式來描述常值:

Array{1, 2, 3}

只要型別中有定義不需要參數的 new 方法以及定義 << 方法,我們就可以使用這個方法來描述該型別的常值:

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

反之,若該型別是泛型如 Set ,則泛型型別參數 T 會如同陣列一般推導,也就是說上方表達式等義於:

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

在泛型的應用上我們也可以手動指定型別:

Set(Int32) {1, 2, 3}

results matching ""

    No results matching ""