30 votes

L'opérateur tilde en Scala

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 ?

53voto

retronym Points 35066

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'expression op e est équivalent à l'application de la méthode postfix e.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égation sin(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

18voto

Rex Kerr Points 94401

~ est l'opérateur "bitwise not" appliqué aux nombres entiers. C'est plus facile à voir en hexadécimal :

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

Prograide.com

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.

Powered by:

X