2011-06-22 15 views
12

¿Cómo modelo un valor opcional en ruby? Scala tiene Option [], que es lo que estoy buscando en ruby.¿Hay un rubí equivalente a la opción de Scala?

+0

¿Qué es un valor opcional? –

+0

La gema Rumonade tiene una opción similar a una scala para ruby: https://github.com/ms-ati/rumonade –

+0

También puedes consultar la gema monádica que implementa la mónada Maybe, que es el equivalente de la opción Scala's - https: //github.com/pzol/monadic –

Respuesta

5

No hay equivalente en la biblioteca estándar. Tienes que definir el tuyo Ver this article.

+0

Eso es lo que temía. Definir bien tu propio trabajo, pero usar una biblioteca/bulitin es más fácil. Gracias. – ladrl

+0

No debería necesitarlo aunque http://stackoverflow.com/questions/5839697/why-is-the-use-of-maybe-option-not-so-pervasive-in-clojure – OscarRyz

+2

@OscarRyz: Estoy de acuerdo con eso los tipos son un aspecto clave en la programación de orden superior, pero es perfectamente posible y plausible hacer una programación de orden superior sin tipos. Los tipos no son un elemento _mandatory_ aquí. Las mónadas son relevantes tanto en lenguajes estáticos como dinámicos (ver el minikanren de Clojure para un excelente ejemplo). La opción es una mónada. Además de proporcionar un mejor tipo de seguridad, tiene varios beneficios, como reducir el texto estándar y, al mismo tiempo, garantizar que se hayan resuelto todos los casos posibles. [..] – missingfaktor

-8

No sé Scala, así que no puedo afirmar que es su respuesta:

En Ruby, cuando se llama a un método, se puede definir un valor predeterminado para un parámetro:

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

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

En ese ejemplo, puede omitir i_am_optionnal, que tiene un valor predeterminado.

HTH.

+1

Eso no es para lo que 'Option' mónada es para. – missingfaktor

+0

Ese era el riesgo ... Gracias a precisar :) – ook

4

No soy un experto en Ruby, pero no creo que haya una opción equivalente. Como Ruby está orientado a objetos, nada le impide escribir su propia implementación, pero no será tan útil como en un lenguaje estáticamente tipado, donde el compilador fuerza para que haga una comprobación adecuada de la opción vacía, que es una de los puntos principales para usar esta construcción. Por supuesto, hay otras ventajas, como la posibilidad de encadenar valores de Opción de varias maneras.

2

¿Has echado un vistazo a la gema Rumonade? Te da una clase de opción modelada en 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

No es un ejemplo de una clase en Maybe de adt library nkpart bajo examples/common_adts.rb. También hay otros ejemplos de ADT y la biblioteca facilita la definición de los tuyos.

0

Acabo de empujar una gema llamada nil_be_gone que le da una Opcional con la que puede envolver objetos. Implementa method_missing para comprobar si el valor de Optional es nulo y, si es así, simplemente devuelve otro valor nil envuelto opcional; de lo contrario, llama al método sobre el objeto y lo vuelve a envolver.

implementos nil_be_gone bind como and_then que le permite operaciones de la cadena sobre los tipos opcional, es métodos de retorno que recupera el valor de opcional es el valor y el funcionamiento de la unidad que envuelve un objeto en la mónada se define por self.from_value.