2012-02-25 59 views
26

Scala的這一點在做什麼?Scala中的波形符號運算符

例如:

scala> val apple = 1 
apple: Int = 1 

scala> ~apple 
res0: Int = -2 

什麼是蠕蟲做我的蘋果嗎?

+2

的ScaleX,像hoogle斯卡拉:http://scalex.org/?q=~ – 2012-02-25 15:29:07

+0

@GeneT鏈路斷開時 – sjking 2016-11-28 19:10:51

回答

46

首先,一些元建議。任何時候你想知道編譯器如何擴展一些語法糖,推斷一個類型,或者應用一個隱式轉換,使用scala -Xprint:typer -e <expr>來告訴你發生了什麼。

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

好,前綴~被擴展到的unary_~常規方法調用。

language specification

6.12.1預音響X操作

預音響X操作運算Ë由一個前置音響X操作符op,這必須是identi音響ERS之一+-!~。 表達式op e相當於post-fi方法應用程序 e.unary_op

前綴運算符與 中的普通函數應用程序不同,它們的操作數表達式不必是原子的。例如, 輸入序列-sin(x)被讀取爲-(sin(x)),而函數 應用否定sin(x)將被解析爲在操作符sin中對應於操作數negate和(x)的 。

這意味着,前綴運營商並不侷限於內建類型,他們可以在自己的類型可以使用(雖然這不是一個好主意,瘋狂地使用這種權力!)

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

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

那麼,你的問題是什麼?您可以檢出標準庫的ScalaDoc的索引methods starting with unightly ScalaDoc最近爲此方法添加了一些文檔。

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

感謝您的解釋和參考。 – Jack 2012-02-25 08:48:40

16

~是應用於整數時的按位不是運算符。在十六進制中最容易看到:

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

+1確認它是按位不是運營商。當你回答時,我正在擺弄打印二進制字符串。道歉,我只能接受一個答案。 – Jack 2012-02-25 08:47:21

+2

「最簡單」可能是主觀... – FracturedRetina 2014-06-30 22:06:09