在Crystal

时间:2018-04-18 18:24:23

标签: crystal-lang union-types

我一直在关注Crystal的官方文档,但我找不到任何有关此问题的详细信息。声明联合类型时的常规语法是String | Int32。但是,我注意到Nil类型的差异。

宣布工会的常规方式仍然有效:

def foo(id : String | Nil)
end

# Overloads are:
#  - foo(id : String | Nil)

但是我也看到了一个缩短的语法,我找不到任何文档:

def foo(id : String?)
end

# Overloads are:
#  - foo(id : String | ::Nil)

Nil外,如果前缀为2个冒号,结果几乎完全相同。我猜这是与Nil的全球范围有关的事情,因为我在其他语言中看到了类似的语法。

  1. String | NilString?是一样的,你应该何时使用另一个?
  2. 类型签名中2个冒号的含义是什么(例如::Nil)?

1 个答案:

答案 0 :(得分:6)

  1. 是的,它们完全相同,人们通常使用Foo?版本,因为它更短。

  2. ::Nil表示“根命名空间中的类Nil”。这意味着如果您在不同的命名空间中定义不同的Nil类,::Nil总是引用stdlib中的nil。