Scala中的波浪号运算符

Jac*_*ack 28 scala

在这一点Scala中做了什么?

例如:

scala> val apple = 1
apple: Int = 1

scala> ~apple
res0: Int = -2
Run Code Online (Sandbox Code Playgroud)

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

ret*_*nym 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_~
Run Code Online (Sandbox Code Playgroud)

好的,前缀~扩展为常规方法调用unary_~.

语言规范:

6.12.1预备操作

预连接的X操作运算Ë由一个前置音响X操作符op,这必须是identi音响ERS中的一个的+,-,!~.该表达式op e等同于post fi x方法应用程序 e.unary_op.

Pre fi x运算符与普通函数应用程序的不同之处在于它们的操作数表达式不必是原子的.例如,输入序列-sin(x)被读取为-(sin(x)),而函数应用程序否定sin(x)将被解析为in fi x operator sin对操作数negate和(x)的应用.

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

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

scala> ~foo
res0: java.lang.String = !!!
Run Code Online (Sandbox Code Playgroud)

那么,你的问题是什么?对于u.开头方法,您可以检查标准库的ScalaDoc索​​引.在夜间ScalaDoc对这种方法的一些最近添加的文档.

the bitwise negation of this value
Example:
~5 == -6
// in binary: ~00000101 ==
//             11111010
Run Code Online (Sandbox Code Playgroud)


Rex*_*err 18

~应用于整数时,是按位运算符.以十六进制最容易看到:

scala> "%x".format( ~0x7F )
res0: String = ffffff80
Run Code Online (Sandbox Code Playgroud)

  • +1用于确认它是按位非运算符.当你回答时,我正在摆弄打印二进制字符串.抱歉,我只能接受一个答案. (2认同)