2011-06-22 29 views
12

如何在ruby中爲可選值建模? Scala有Option [],這是我在Ruby中尋找的東西。是否有與Scala選項等價的紅寶石?

+0

什麼是可選值? –

+0

Rumonade寶石有一個類似scala的選項用於ruby:https://github.com/ms-ati/rumonade –

+0

你也可以檢查實現Maybe monad的monadic gem,這相當於Scala的Option - https: //github.com/pzol/monadic –

回答

5

標準庫中沒有等價物。你必須定義你自己的。見this article

+0

這就是我擔心的。很好地定義你自己的作品,但使用圖書館/ bulitin更容易。謝謝。 – ladrl

+0

你應該不需要它,雖然http://stackoverflow.com/questions/5839697/why-is-the-use-of-maybe-option-not-so-pervasive-in-clojure – OscarRyz

+2

@OscarRyz:我同意這些類型是高階編程的一個關鍵方面,但是在沒有類型的情況下進行高階編程是完全可能的和合理的。類型在這裏不是_mandatory_元素。 Monad在靜態語言和動態語言中都很重要(參見Clojure的minikanren就是一個很好的例子)。選項是一個monad。除了提供更好的類型安全之外,它還有幾個好處,例如減少樣板,同時保證處理所有可能的情況。 [...] – missingfaktor

-8

我不知道斯卡拉,所以我不能斷言你的答案:

在Ruby中,當你調用一個方法,你可以設置了一個param定義的默認值:

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。

+1

這並不完全是'Option' monad的用途。 – missingfaktor

+0

這是風險......謝謝你準確:) – ook

4

我不是Ruby專家,但我不認爲有相當於Option的選項。由於Ruby是面向對象的,所以沒有什麼能阻止你編寫你自己的實現,但它不如靜態類型語言那樣有用,編譯器強制你對空選項進行適當檢查,使用這種結構的要點。當然還有其他優點,比如可以通過多種方式鏈接選項值。

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"] 
1

有一個Maybe類的nkpart的adt libraryexamples/common_adts.rb下一個例子。還有其他示例ADT,並且該庫可以更容易地定義您自己的。

0

我剛推了一個名爲nil_be_gone的寶石,它給了你一個可選項,你可以用它來包裝對象。它實現了method_missing來檢查Optional的值是否爲零,如果是則返回另一個可選的被包裝的nil值,否則它調用該對象上的方法並重新包裝它。

nil_be_gone器具bind作爲and_then它允許你上可選類型鏈運作,這是其檢索值從可選是值和它封裝在單子的對象被定義self.from_value單元操作返回的方法。