2012-04-01 3 views
5

ya he leído que la sentencia if en Scala siempre devuelve una expresiónnovato Scala tener problemas con la opción, ¿cuál es el equivalente del operador ternario

Así que estoy tratando de hacer lo siguiente (pseudo código)

sql = "select * from xx" + iif(order.isDefined, "order by " order.get, "") 

estoy tratando con

val sql: String = "select * from xx" + if (order.isDefined) {" order by " + order.get} else {""} 

pero me sale este error:

illegal start of simple expression 

orden es una opción [String]

Yo sólo quiero tener un parámetro opcional a un método, y si ese parámetro (en este orden de casos) no se pasa entonces a la omitida

lo haría ser la forma más idiomática de lograr lo que estoy tratando de hacer?

- editar -

supongo que apuré demasiado pedir

encontré esta manera,

val orderBy = order.map(" order by " + _).getOrElse("") 

Es esta la forma correcta de hacerlo?

pensé mapa estaba destinado para otros fines ...

+2

La razón por la que su código no se está compilando es porque necesita paréntesis alrededor del ' if' expresión. Pero como señala Tomasz Nurkiewicz, hay mejores formas de escribir esto de todos modos. –

+1

¿Alguien quiere comentar sobre * por qué * necesitamos corchetes alrededor de la expresión if (que no sea "porque compila")? –

+1

@LuigiPlinge esto es solo una especulación, pero puede ser que quisieran evitar la confusión del programador sobre cómo se asociaría una expresión como '1 + if (b) 2 else 3 + 4 '. ¿Es '1 + (si (b) 2 else 3) + 4' o' 1 + (si (b) 2 else 3 + 4) '? Ciertamente, podrías tener una gramática que resuelva esta ambigüedad (lo hace Haskell), pero eso no significa que las personas no cometerán errores porque asumieron un comportamiento diferente. –

Respuesta

11

En primer lugar no está utilizando Option[T] idiomáticamente, intente esto:

"select * from xx" + order.map(" order by " + _).getOrElse("") 

o con diferente sintaxis:

"select * from xx" + (order map {" order by " + _} getOrElse "") 

que es más o menos equivalente a:

"select * from xx" + order match { 
    case Some(o) => " order by " + o 
    case None => "" 
} 

Eche un vistazo a scala.Option Cheat Sheet. Pero si realmente quiere seguir el camino de la fea if s (paréntesis que faltan alrededor if):

"select * from xx" + (if(order.isDefined) {" order by " + order.get} else {""}) 
+0

Muchas gracias, Tomasz, acabo de encontrarlo en google ... Y sí, estoy tratando de aprender la forma más idiomática de trabajar con Scala ... – opensas

0

... o, si realmente quiere impresionar a sus amigos:

order.foldLeft ("") ((_,b)=>"order by " + b) 

(I Todavía recomendaría la respuesta de Tomasz, pero creo que esta no está incluida en la scala. Hoja de referencia de la opción, así que pensé en mencionarla)

+1

Si vas a doblar, ¿por qué no usar el prefijo como valor inicial y hacer todo de una vez? 'val sql = order.foldLeft (" select * from xx ") ((_, b) =>" ordena por "+ b)' –

+0

@AndrzejDoyle tienes razón, esa es una forma de hacerlo ... estaba imaginando que esto es parte de una consulta más grande construida dinámicamente donde tienes una función que construye solo la parte "ordenar por", otra que construye las cláusulas "donde" y las pones juntas al final –

Cuestiones relacionadas