这两种语法看起来相当等效,它们的用例也相似。示例:
# Hash
hash = {"name" => "Crystal", "year" => 2011}
hash["name"] # outputs: Crystal
# NamedTuple
tuple = {name: "Crystal", year: 2011}
tuple[:name] # outputs: Crystal
那么,这两个原始体到底在哪里不同呢?
API文档已经很好地解释了这一点。来自NamedTuple
(我强调(:
命名元组是一个固定大小、不可变、由堆栈分配的固定键集到值的映射。
您可以将NamedTuple视为不可变的Hash,其键(类型为Symbol(和每个键的类型在编译时都是已知的。
还有:
编译器知道每个键中的类型,因此当用符号文字索引命名元组时,编译器将返回该键的值和预期类型。使用没有关键字的符号文字进行索引将导致编译时错误。
相比之下,Hash
:
哈希是将K类型的密钥映射到V类型的值的密钥-值对的通用集合。
简单地说,哈希是一种可以在运行时更改的数据结构,所有键/值都可以具有任何类型,只要它与泛型类型参数K/V匹配。另一方面,命名元组是一种不可变的数据结构,在编译时是完全已知的。如果访问一个键,编译器就会知道它的类型。拥有一个命名元组与只将键作为带有公共前缀的变量非常相似:
foo = {bar: "bar", baz: 1}
foo_bar = "bar"
foo_baz = 1
NamedTuple
只是添加了一些工具来将这些变量用作一个连贯集。