在Crystal中使用nil声明union类型

我一直在关注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 | NilString? 同样的事情,什么时候应该使用一个与另一个?

  • 类型签名中2冒号的含义是什么(例如 ::Nil )?

回答(1)

2 years ago

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

  • ::Nil 表示"the class Nil at the root namespace" . 这意味着如果在不同的命名空间中定义不同的 Nil 类, ::Nil 总是引用stdlib中的nil .