2012-02-25 12 views
26

¿Qué hace ~ en este trozo de Scala?El operador de tilde en Scala

Por ejemplo:

scala> val apple = 1 
apple: Int = 1 

scala> ~apple 
res0: Int = -2 

¿Qué hizo ese gusano hacer a mi manzana?

+2

Scalex, como Hoogle de Scala: http://scalex.org/?q=~ –

+0

@GeneT vínculo se rompe – sjking

Respuesta

46

En primer lugar, algunos consejos. Cada vez que se pregunte cómo el compilador expande algo de azúcar sintáctica, infiere un tipo o aplica una conversión implícita, use scala -Xprint:typer -e <expr> para mostrarle lo que sucedió.

scala -Xprint:typer -e "val a = 2; ~a" 

... 
private[this] val a: Int = 2; 
private <stable> <accessor> def a: Int = $anon.this.a; 
$anon.this.a.unary_~ 

bien, un prefijo ~ se expande para una invocación de método regular de unary_~.

Desde el language specification:

6.12.1 Pre fi x Operaciones

Un pre fi x operación op e consiste en un pre fi op x operador, que debe ser uno de los los identificadores +, -, ! o ~. La expresión op e es equivalente a la aplicación de método post fi x e.unary_op.

Los operadores de prefijos son diferentes de las aplicaciones de funciones normales en que su expresión de operando no tiene que ser atómica. Por ejemplo, la secuencia de entrada -sin(x) se lee como -(sin(x)), mientras que la aplicación aplicación negar sin(x) se analizará como la aplicación del en el operador fi x a los operandos negar y (x).

Eso significa que los operadores de prefijo no se restringen al construida en tipos, que se puede utilizar en sus propios tipos (aunque no es una buena idea para volverse loco con este poder!)

scala> object foo { def unary_~ = "!!!" } 
defined module foo 

scala> ~foo 
res0: java.lang.String = !!! 

Entonces, ¿qué hay de tu pregunta? Puede consultar el índice de ScalaDoc para la biblioteca estándar para methods starting with u. El nightly ScalaDoc tiene documentación recientemente agregada para este método.

the bitwise negation of this value 
Example: 
~5 == -6 
// in binary: ~00000101 == 
//    11111010 
+0

Gracias por la explicación y referencias. – Jack

16

~ es el operador bitwise no cuando se aplica a enteros. Es más fácil de ver en hexadecimal:

scala> "%x".format(~0x7F) 
res0: String = ffffff80 
+2

1 para confirmar que no es el bit a bit operador. Estuve jugando con la impresión de la cadena binaria cuando respondiste. Disculpa que solo puedo aceptar una respuesta. – Jack

+2

"más fácil" puede ser subjetivo ... – FracturedRetina

Cuestiones relacionadas