¿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?
¿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?
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ónop e
es equivalente a la aplicación de método post fi xe.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 negarsin(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
Gracias por la explicación y referencias. – Jack
~
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
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
"más fácil" puede ser subjetivo ... – FracturedRetina
Scalex, como Hoogle de Scala: http://scalex.org/?q=~ –
@GeneT vínculo se rompe – sjking