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