2011-06-22 11 views
12

Jak mogę modelować opcjonalną wartość w ruby? Scala ma Option [], czego właśnie szukam w ruby.Czy istnieje rubinowy odpowiednik opcji Scala?

+0

Co to jest opcjonalna wartość? –

+0

Klejnot rumonady ma opcję podobną do scala dla ruby: https://github.com/ms-ati/rumonade –

+0

Można również sprawdzić monadyczny klejnot, który implementuje Monadę Maybe, która jest odpowiednikiem opcji Scala - https: //github.com/pzol/monadic –

Odpowiedz

5

Nie ma odpowiednika w standardowej bibliotece. Musisz zdefiniować swój własny. Zobacz this article.

+0

Tego się obawiałem. Zdefiniowanie własnych dzieł dobrze, ale korzystanie z biblioteki/biuletynu jest w większości łatwiejsze. Dziękuję Ci. – ladrl

+0

Nie powinieneś tego potrzebować, chociaż http://stackoverflow.com/questions/5839697/why-is-the-use-of-maybe-option-not-so-pervasive-in-clojure – OscarRyz

+2

@Ocarcar: Zgadzam się, że typy są kluczowym aspektem w programowaniu wyższego rzędu, ale możliwe jest dokonywanie programowania wyższego rzędu bez typów. Typy nie są tutaj elementem mędrnym. Monady są istotne zarówno w językach statycznych, jak i dynamicznych (patrz minikanren firmy Clojure jako doskonały przykład). Opcja to monada. Oprócz zapewnienia wyższego poziomu bezpieczeństwa, ma on wiele zalet, takich jak zmniejszenie zasięgu, a jednocześnie daje pewność, że wszystkie możliwe przypadki zostały rozwiązane. [..] – missingfaktor

-8

nie wiem Scala, więc nie można twierdzić, że twoja odpowiedź:

W Ruby, kiedy wywołać metodę, można określić wartość domyślną dla param:

def foo(i_am_mandatory, i_am_optionnal = :banga) 
    puts i_am_optionnal 
end 

foo(:pouet, :plip) 
=> :plip 
foo(:pouet) 
=> :banga 

W tym przykładzie można pominąć parametr i_am_optionnal, który ma wartość domyślną.

HTH.

+1

To nie jest do czego służy monada "Opcja". – missingfaktor

+0

To było ryzyko ... Dziękuję, że to sprecyzowałem :) – ook

4

Nie jestem ekspertem w dziedzinie Rubin, ale nie sądzę, że istnieje odpowiednik opcji. Ponieważ Ruby jest zorientowany obiektowo, nic nie stoi na przeszkodzie, aby napisać własną implementację, ale nie będzie to tak użyteczne, jak w statycznie pisanym języku, w którym kompilator musi wykonać odpowiednie sprawdzenie pustej opcji, która jest jedną z opcji. głównych punktów użycia tego konstruktu. Oczywiście istnieją inne zalety, takie jak możliwość łączenia wartości opcji na kilka sposobów.

2

Czy sprawdziłeś klejnot Rumonade? Daje ci klasę opcji wzorowaną na scala.

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

Jest przykładem klasy Maybe w nkpart na adt library pod examples/common_adts.rb. Istnieją również inne przykłady ADT, a biblioteka ułatwia definiowanie własnych.

0

Właśnie wysłałem klejnot o nazwie nil_be_gone, który daje Opcjonalnie możliwość zawijania obiektów. Implementuje on metodę method_missing, aby sprawdzić, czy wartość Opcjonalnego jest zerowa, a jeśli tak, to po prostu zwróci inną opcjonalną wartość zerową owinięcia, w przeciwnym razie wywoła metodę na obiekcie i opakuje ją ponownie.

nil_be_gone narzędzia bind jak and_then który pozwala na operacje na opcjonalnym typów łańcuchowych, to metody zwrotu, którą pobiera wartość z Opcjonalnie jest wartość i działanie jednostka, która zawija obiekt w monady jest zdefiniowany przez self.from_value.

Powiązane problemy