12

如何在 ruby​​ 中为可选值建模?Scala 有 Option[],这是我在 ruby​​ 中寻找的。

4

6 回答 6

5

标准库中没有等价物。你必须定义你自己的。见这篇文章

于 2011-06-22T06:46:30.910 回答
4

我不是 Ruby 专家,但我不认为有 Option 等价物。由于 Ruby 是面向对象的,没有什么能阻止您编写自己的实现,但它不会像在静态类型语言中那样有用,在静态类型语言中,编译器会强制您对空选项进行适当的检查,这是其中之一使用此构造的要点。当然还有其他优点,比如可以通过多种方式链接 Option 值。

于 2011-06-22T06:49:37.587 回答
2

您检查过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"]
于 2011-09-27T20:45:48.150 回答
1

Maybe在 nkpart 的adt 库中有一个类的示例examples/common_adts.rb。还有其他示例 ADT,该库可以更轻松地定义您自己的 ADT。

于 2011-09-27T23:14:07.610 回答
0

我刚刚推送了一个名为nil_be_gone的 gem ,它为您提供了一个 Optional,您可以使用它来包装对象。它实现 method_missing 来检查 Optional 的值是否为 nil,如果是则简单地返回另一个 Optional 包装的 nil 值,否则它调用对象上的方法并再次包装它。

nil_be_gone 实现bindand_then允许您对 Optional 类型进行链接操作,它的 return 方法从 Optional 检索值是 value 并且在 monad 中包装对象的单元操作由self.from_value.

于 2016-05-13T16:09:34.247 回答
-8

我不知道 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。

于 2011-06-22T06:37:55.097 回答