如何在 ruby 中为可选值建模?Scala 有 Option[],这是我在 ruby 中寻找的。
6 回答
标准库中没有等价物。你必须定义你自己的。见这篇文章。
我不是 Ruby 专家,但我不认为有 Option 等价物。由于 Ruby 是面向对象的,没有什么能阻止您编写自己的实现,但它不会像在静态类型语言中那样有用,在静态类型语言中,编译器会强制您对空选项进行适当的检查,这是其中之一使用此构造的要点。当然还有其他优点,比如可以通过多种方式链接 Option 值。
您检查过Rumonade宝石吗?它为您提供了一个以 scala 为模型的 Option 类。
require 'rumonade'
[nil, 1, 123].map { |v| Option(v) }
=> [None, #<Rumonade::Some:0x7f2589297768 @value=1>, #<Rumonade::Some:0x7f2589297740 @value=123>]
[nil, 1, 123].map { |v| Option(v).map { |n| n.to_s }.select { |s| s.size > 2 } }.flatten
=> ["123"]
Maybe
在 nkpart 的adt 库中有一个类的示例examples/common_adts.rb
。还有其他示例 ADT,该库可以更轻松地定义您自己的 ADT。
我刚刚推送了一个名为nil_be_gone的 gem ,它为您提供了一个 Optional,您可以使用它来包装对象。它实现 method_missing 来检查 Optional 的值是否为 nil,如果是则简单地返回另一个 Optional 包装的 nil 值,否则它调用对象上的方法并再次包装它。
nil_be_gone 实现bind
为and_then
允许您对 Optional 类型进行链接操作,它的 return 方法从 Optional 检索值是 value 并且在 monad 中包装对象的单元操作由self.from_value
.
我不知道 Scala,所以我不能断言这是你的答案:
在 ruby 中,当你调用一个方法时,你可以为一个参数定义一个默认值:
def foo(i_am_mandatory, i_am_optionnal = :banga)
puts i_am_optionnal
end
foo(:pouet, :plip)
=> :plip
foo(:pouet)
=> :banga
在该示例中,您可以省略具有默认值的 i_am_optionnal。
HTH。