跳至內容

雜湊

雜湊是一種鍵值對的泛型集合,將型別為 K 的鍵映射到型別為 V 的值。

雜湊通常使用雜湊字面值建立,以大括號 ({ }) 表示,其中包含一系列以 => 作為鍵值分隔符號,並以逗號 , 分隔的鍵值對。

{"one" => 1, "two" => 2}

泛型型別參數

鍵的泛型型別參數 K 和值的泛型型別參數 V 分別從字面值內的鍵或值的型別推斷而來。當所有鍵或值都具有相同的型別時,K/V 等於該型別。否則,它將分別是所有鍵型別或值型別的聯集。

{1 => 2, 3 => 4}   # Hash(Int32, Int32)
{1 => 2, 'a' => 3} # Hash(Int32 | Char, Int32)

可以通過在右括號後立即加上 of (以空格分隔)、鍵型別 (K),然後加上 => 作為分隔符號,以及值型別 (V) 來指定明確的型別。這會覆寫推斷的型別,例如,可用於建立最初僅保留某些型別,但也可以接受其他型別的雜湊。

空的雜湊字面值始終需要型別規格

{} of Int32 => Int32 # => Hash(Int32, Int32).new

類雜湊型別字面值

Crystal 支援用於雜湊和類雜湊型別的額外字面值。它由型別名稱後跟一個以大括號 ({}) 括起來的逗號分隔的鍵值對列表組成。

Hash{"one" => 1, "two" => 2}

只要該型別具有無引數的建構子並回應 []=,就可以將此字面值用於任何型別。

HTTP::Headers{"foo" => "bar"}

對於像 HTTP::Headers 這樣的非泛型型別,這等同於

headers = HTTP::Headers.new
headers["foo"] = "bar"

對於泛型型別,泛型型別會以與雜湊字面值相同的方式從鍵和值的型別推斷而來。

MyHash{"foo" => 1, "bar" => "baz"}

如果 MyHash 是泛型的,則上述內容等同於以下內容

my_hash = MyHash(typeof("foo", "bar"), typeof(1, "baz")).new
my_hash["foo"] = 1
my_hash["bar"] = "baz"

型別引數可以明確地指定為型別名稱的一部分

MyHash(String, String | Int32){"foo" => "bar"}