雜湊¶
雜湊是一種鍵值對的泛型集合,將型別為 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"}