我一直在关注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
的全球范围有关的事情,因为我在其他语言中看到了类似的语法。
String | Nil
和String?
是一样的,你应该何时使用另一个?::Nil
)?答案 0 :(得分:6)
是的,它们完全相同,人们通常使用Foo?
版本,因为它更短。
::Nil
表示“根命名空间中的类Nil”。这意味着如果您在不同的命名空间中定义不同的Nil
类,::Nil
总是引用stdlib中的nil。