Scala中的波浪号运算符

时间:2012-02-25 08:12:42

标签: scala

Scala的这一点做了什么?

例如:

scala> val apple = 1
apple: Int = 1

scala> ~apple
res0: Int = -2

那只虫对我的苹果做了什么?

2 个答案:

答案 0 :(得分:52)

首先,一些元建议。每当你想知道编译器如何扩展一些语法糖,推断类型或应用隐式转换时,使用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预备操作

     

预处理操作op e由pre fi x运算符op组成,它必须是标识符+-!~之一。   表达式op e等同于post fi x方法应用程序   e.unary_op

     

Pre fi x运算符与正常函数应用程序不同   他们的操作数表达式不必是原子的。例如,   输入序列-sin(x)读作-(sin(x)),而函数   应用程序否定sin(x)将被解析为应用程序   in fi x operator sin to the operands negate and(x)。

这意味着前缀运算符不限于内置类型,它们可以在您自己的类型中使用(尽管使用此功能疯狂不是一个好主意!)

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

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

那么,你的问题是什么?您可以签出methods starting with u标准库的ScalaDoc索​​引。 nightly ScalaDoc最近添加了一些此方法的文档。

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

答案 1 :(得分:17)

~是应用于整数时的按位非运算符。最简单的看一下:

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