2012-02-25 63 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