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