Scala的这一点做了什么?
例如:
scala> val apple = 1
apple: Int = 1
scala> ~apple
res0: Int = -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_~
的常规方法调用。
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