如何在ruby中建模可选值? Scala有Option [],这就是我在ruby中寻找的东西。
答案 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。