ハッシュ¶
ハッシュ は、型 `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"
`headers = HTTP :: Headers.new headers["Content-Type"] = "text/plain"`
MyHash{"foo" => 1, "bar" => "baz"}
ジェネリック型の場合、ジェネリック型はハッシュリテラルと同じ方法でキーと値の型から推論されます。
my_hash = MyHash(typeof("foo", "bar"), typeof(1, "baz")).new
my_hash["foo"] = 1
my_hash["bar"] = "baz"
`MyHash`がジェネリックの場合、上記はこれと同等です
MyHash(String, String | Int32){"foo" => "bar"}