在 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
的全局范围有关,因为我在其他语言中看到过类似的语法。
String | Nil
和 String?
是一回事吗?您应该什么时候使用它们?
- 类型签名中的 2 个冒号是什么意思(例如
::Nil
)?
是的,它们完全一样,人们通常使用 Foo?
版本,因为它更短。
::Nil
表示"the class Nil at the root namespace"。这意味着如果您在不同的命名空间中定义了不同的 Nil
class,::Nil
总是引用标准库中的 nil。
我一直在关注 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?
是一回事吗?您应该什么时候使用它们?- 类型签名中的 2 个冒号是什么意思(例如
::Nil
)?
是的,它们完全一样,人们通常使用
Foo?
版本,因为它更短。::Nil
表示"the class Nil at the root namespace"。这意味着如果您在不同的命名空间中定义了不同的Nil
class,::Nil
总是引用标准库中的 nil。