Que fait le ~ dans ce morceau de Scala ?
Par exemple :
scala> val apple = 1
apple: Int = 1
scala> ~apple
res0: Int = -2
Qu'est-ce que ce ver a fait à ma pomme ?
Que fait le ~ dans ce morceau de Scala ?
Par exemple :
scala> val apple = 1
apple: Int = 1
scala> ~apple
res0: Int = -2
Qu'est-ce que ce ver a fait à ma pomme ?
Tout d'abord, quelques méta-conseils. Chaque fois que vous vous demandez comment le compilateur développe un sucre syntaxique, déduit un type, ou applique une conversion implicite, utilisez scala -Xprint:typer -e <expr>
pour vous montrer ce qui s'est passé.
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_~
Ok, un préfixe ~
est étendu à une invocation de méthode régulière de unary_~
.
De la spécification du langage :
6.12.1 Opérations de Prefix
Un prefix d'opération op e consiste en un prefix d'opérateur op, qui doit être l'un des identifiers suivants .
+
,-
,!
o~
. L'expressionop e
est équivalent à l'application de la méthode postfixe.unary_op
.Les opérateurs de préfix diffèrent des applications de fonctions normales en ce que que leur expression d'opérande ne doit pas nécessairement être atomique. Par exemple, la
-sin(x)
se lit comme suit-(sin(x))
alors que la fonction application négationsin(x)
serait analysé comme l'application de l'opérateur infix opérateur sin aux opérandes negate et (x).
Cela signifie que les opérateurs de préfixe ne sont pas limités aux types intégrés, ils peuvent être utilisés sur vos propres types (bien que ce ne soit pas une bonne idée de devenir fou avec cette puissance !)
scala> object foo { def unary_~ = "!!!" }
defined module foo
scala> ~foo
res0: java.lang.String = !!!
Alors, quelle est votre question ? Vous pouvez consulter l'index de la ScalaDoc pour la bibliothèque standard de les méthodes commençant par u
. Le site ScalaDoc nocturne contient une documentation récemment ajoutée pour cette méthode.
the bitwise negation of this value
Example:
~5 == -6
// in binary: ~00000101 ==
// 11111010
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.