2012-02-25 14 views
26

Co robi ~ w tym kawałku Scali?Operator tyldy w Scali

Na przykład:

scala> val apple = 1 
apple: Int = 1 

scala> ~apple 
res0: Int = -2 

że robak Co zrobić, aby moje jabłka?

+2

scaleX, jak hoogle do Scala: http://scalex.org/?q=~ –

+0

@GeneT link jest uszkodzony – sjking

Odpowiedz

46

Po pierwsze, kilka meta-porad. Za każdym razem, gdy zastanawiasz się, w jaki sposób kompilator rozwija jakiś cukier syntaktyczny, podaje typ lub stosuje niejawną konwersję, użyj scala -Xprint:typer -e <expr>, aby pokazać, co się stało.

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_~ 

Dobra, prefiks ~ rozpręża się do zwykłego sposobu pw unary_~.

Z language specification:

6.12.1 Wstępnie fi x Operacje

wstępnym fi x działanie op zawiera wstępnie fi x operatora OP, która musi być jedną z stwierdziliśmy ers fi +, -, ! lub ~. Wyrażenie op e jest równoważne z aplikacją metody post-xxx e.unary_op.

Operatory predfx różnią się od zwykłych aplikacji funkcji w , że ich wyrażenie operandowe nie musi być atomowe. Na przykład, sekwencja wejściowa wejściowa -sin(x) jest odczytywana jako -(sin(x)), podczas gdy funkcja neguje, że zostanie zinterpretowana jako zastosowanie operatora operatora do zanegowania i (x).

Oznacza to, że operatorzy prefiks nie są ograniczone do zbudowany w typów, mogą one być stosowane na własnych typów (choć nie jest to dobry pomysł, aby oszaleć z tej mocy!)

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

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

A co z twoim pytaniem? Możesz sprawdzić indeks ScalaDoc dla biblioteki standardowej dla methods starting with u. W dokumencie nightly ScalaDoc jest ostatnio dodana dokumentacja dla tej metody.

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

Dzięki za wyjaśnienia i referencje. – Jack

16

~ jest operatorem bitowym, nie stosuje się do liczb całkowitych. Najłatwiej zobaczyć na hex:

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

+1 dla potwierdzenia, że ​​to nie bitowe operatora. Bawiłem się przy drukowaniu binarnego ciągu, kiedy odpowiadałeś. Przepraszam, że mogę przyjąć tylko jedną odpowiedź. – Jack

+2

"najprostszy" może być subiektywny ... – FracturedRetina