如何将“允许 nil”添加到 Ruby 中的类型声明中? 可选类型

问题描述

我熟悉 Ruby 中的类型注释。但是,没有任何地方提到过关于 nilable 类型的内容。也就是说,类似于以下内容

class Merchant
  attr_reader token: String # never nil
  attr_reader name: String # how to signal it that it may be nil? 
  [.......]
end

反之亦然:我希望能够描述一种不允许 nil 值的类型。

这可能吗?怎么样?

更新 1:

irb(main):009:0> tp1 = String
=> String
irb(main):010:0> v1 = "fdsafds"
=> "fdsafds"
irb(main):011:0> tp1 === v1
=> true
irb(main):012:0> tp2 = String?
Traceback (most recent call last):
        1: from (irb):12:in `<main>'
NoMethodError (undefined method `String?' for main:Object)
Did you mean?  String

为什么会失败?

解决方法

您可以在 RBS 的登录页面上看到此权限的示例:

attr_reader reply_to: Message? # `?` means optional type: `#reply_to` can be `nil`

更具体地说,它在 the Syntax documentation 中:

可选类型

可选类型表示一种值或 nil

Integer?
Array[Integer?]

所以,对于你的情况,那就是

attr_reader name: String?