是否有相当于Scala选项的红宝石?

时间:2011-06-22 06:27:32

标签: ruby scala scala-option

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

6 个答案:

答案 0 :(得分:5)

标准库中没有等效文件。你必须定义自己的。请参阅this article

答案 1 :(得分:4)

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

答案 2 :(得分: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"]

答案 3 :(得分:1)

Maybe下的nkpart adt library中有一个examples/common_adts.rb类的示例。还有其他示例ADT和库可以更容易地定义自己的。

答案 4 :(得分:0)

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

nil_be_gone将bind实现为and_then,它允许您对Optional类型进行链接操作,它的返回方法从Optional is value中检索值,并且定义包装monad中对象的单元操作self.from_value

答案 5 :(得分:-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。