2009-11-24 5 views
6

¿Cuál es una forma más fácil/más limpia de hacer esto?Idioma para la opción de Scala al hacer pruebas de igualdad

val o = Some(4) 
if(o.isDefined) {o.get == 4} else { false } 

He intentado

o.getOrElse(null) == 4 

pero que se siente mal, ya que en el caso estaVacia, se termina la prueba nula contra el otro lado ... sí que podría ser nulo. Necesito que sea si se define opt & & opt.get == whatever. Siento que algún método de opción debe tomar sólo una función, y que podría hacerlo de esta manera:

o.test((x) => x == 4) 

y sería aplicar la función sólo si o.isDefined.

+1

duplicado exacto: http://stackoverflow.com/questions/1611872/a-better-way-to-test-the-value-of-an-option - el cual , de hecho, es la primera pregunta "relacionada" en la lista. –

+0

No subí cuando busqué. Gracias por vincularlos. – Trenton

Respuesta

7

Esto parece bastante limpio para mí:

o.map(4==).getOrElse(false) 

Si lo desea, podría incluso añadir una conversión implícita para agregar un método de conveniencia para esto:

implicit def richOption[A](o: Option[A]) = new { 
    def test(p: A => Boolean): Boolean = o.map(p).getOrElse(false) 
} 
+0

¿Cuál es el propósito del '==' después del 4? –

+0

"' 4 == '" es una función que prueba la igualdad con 4 –

+0

azúcar Scala. 4 == se trata como una función anónima de un argumento en este caso. Más claramente (pero con más detalle) podría ser: 'o.map (4. ==)' o 'o.map (_ == 4)' o 'o.map (x => x == 4)'. El punto clave aquí es que pase lo que pase a Option.map() solo se evalúa en las opciones que no son None. – overthink

5

¿Qué tal esto:

val o = Some(4) 
o match { 
    case Some(4) => true 
    case _ => false 
} 
2

Lo siguiente me parece más intuitivo, si no te importa la creación de objetos overhe anuncio.

val o = Some(4) 
Some(4) == o 

Otro método unsuggested

val o = Some(4) 
val Some(x) = o; x==4 // Edit: will not compile of o = None 
+0

El segundo método no tiene en cuenta cuando o es Ninguno. –

+0

D'oh! Editado para reflejar ¡Gracias! –

9

También es posible usar:

if (o == Some(4)) //do something 
1
o.map(_ == 4).getOrElse(false) 
12

Ésta es la manera más limpia, más idiomática para hacerlo.

val o = Some(4) 
o.contains(4) // true 
o.contains(5) // false 

Hay también una versión de este predicado:

val o = Some(4) 
o.exists(_ > 0) // true 
o.exists(_ > 100) // false 

usar sólo la versión de predicado si contains no es lo suficientemente fuerte.

1

Prueba esto:

val o = Some(4) 
o.exists(4 == _) 
Cuestiones relacionadas