【问题标题】:Declaring union types with nil in Crystal在 Crystal 中用 nil 声明联合类型
【发布时间】:2018-04-18 18:24:23
【问题描述】:

我一直在关注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. 类型签名中的两个冒号是什么意思(例如::Nil)?

【问题讨论】:

    标签: crystal-lang union-types


    【解决方案1】:
    1. 是的,它们完全一样,人们通常使用Foo? 版本,因为它更短。

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

    【讨论】:

    • 所以在第一种情况下 Nil 没有前缀,因为类型是明确指定的(没有类名冲突的方式)?我也期待,只是需要确认。
    • 没错。当编译器扩展 ? 后缀时,它会将其替换为 | ::Nil 以在全局范围内专门针对 Nil 并避免潜在的命名冲突。
    猜你喜欢
    • 2022-10-07
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多