雜湊 Hash
雜湊(Hash)為用來表示索引鍵(Key)與值(Value)對應關係的泛型集合,其中索引鍵為 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
=======
類・雜湊(Hash-like)型別常值
Crystal 亦對類・雜湊的型別提供以大括號({})的方式來描述常值:
Hash{"one" => 1, "two" => 2}
只要型別中有定義不需要參數的 new 方法以及定義 []= 方法,我們就可以使用這個方法來描述該型別的常值:
HTTP::Headers{"foo" => "bar"}
對於非泛型的型別如 HTTP::Headers,上方表達式等義於:
headers = HTTP::Headers.new
headers["foo"] = "bar"
反之,若該型別是泛型,則泛型型別參數 K 、 V 會如同雜湊一般推導:
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"}