2010-10-23 24 views
5

¿Cómo es que esto no es posible? Estoy recibiendo un comienzo de expresión ilegal.? El operador no funciona

(s1.charAt(i) == ' ') ? i++ : break; 
+0

¿funciona esto si lo tiene en un ciclo [while, for, w/e]? – sova

Respuesta

24

Lo que hay que entender aquí es que el :? operador se utiliza para un valor de retorno. Básicamente está llamando a una función que se ve así en esa línea:

anonymous function: 
    if(s1.charAt(i) == ' '): 
     return i++; 
    else: 
     return break; 

No tiene sentido, ¿verdad? El operador ?: solo se diseñó como una abreviatura para declaraciones de devolución if/else como la anterior, no como un reemplazo de if/else en conjunto.

4

El operador ternario es una expresión, no una afirmación. Use if ... else ... para esto.

13

No se puede usar break en parte de una expresión condicional ternaria ya que break no es una expresión en sí misma, sino solo una sentencia de control de flujo.

¿Por qué no usar simplemente un constructo if-else en su lugar?

if (s1.charAt(i) == ' ') { 
    i++; 
} else { 
    break; 
} 
3

Por supuesto que funciona. Pero es un operador. ¿Desde cuándo fue una declaración como 'romper' un operando?

2

Recomiendo evitar el operador ternario (? :) EXCEPTO para asignaciones simples. En mi carrera, he visto demasiados operadores ternarios anidados locos; se convierten en un dolor de cabeza de mantenimiento (más sobrecarga cognitiva - "¡no me hagas pensar!").

No los prohibo en mis equipos, pero recomiendo que se utilicen con criterio. Usarse con cuidado que son más limpios que la correspondiente construcción if/else: -

public int ifFoo() { 
    int i; 

    if(isSomethingTrue()) { 
     i = 5; 
    } 
    else { 
     i = 10; 
    } 

    return i; 
} 

En comparación con la alternativa ternaria: -

public int ternaryFoo() { 
    final int i = isSomethingTrue() 
       ? 5 
       : 10; 

    return i; 
} 

La versión ternario es: -

  • Shorter
  • Más fácil de entender (mi opinión, por supuesto!)
  • Permite la variable ser "final"; que simplifica la comprensión del código; en un método más complejo, alguien que lea el código sabe que ningún otro código tratará de modificar la variable, una cosa menos de qué preocuparse.
+3

'return isSomethingTrue()? 5: 10; 'es muuucho más claro que 10 líneas si la declaración y esa variable local inútil. – whiskeysierra

+0

Solo pongo la variable local para poder hacer un punto de interrupción en esa línea si alguna vez tengo que depurar. No muy preocupado, de cualquier manera! –

+0

La variable puede ser definitiva en cualquier caso, en la medida en que esté asignada mediante todas las rutas de código antes de su uso. – EJP

Cuestiones relacionadas