在 Crystal 中用 nil 声明联合类型

Declaring union types with nil in Crystal

我一直在关注 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. 是的,它们完全一样,人们通常使用 Foo? 版本,因为它更短。

  2. ::Nil表示"the class Nil at the root namespace"。这意味着如果您在不同的命名空间中定义了不同的 Nil class,::Nil 总是引用标准库中的 nil。