Во-первых, несколько мета-советов. Каждый раз, когда вам интересно, как компилятор расширяет некоторый синтаксический сахар, выводит тип или применяет неявное преобразование, используйте 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
эквивалентно применению метода post-x
e.unary_op
.
Префиксные операторы отличаются от обычных приложений функций в
что выражение их операнда не обязательно должно быть атомарным. Например,
входная последовательность -sin(x)
читается как -(sin(x))
, тогда как функция
Приложение отрицание sin(x)
будет проанализировано как приложение
в фиксированном операторе грех операндов отрицает и (х).
Это означает, что префиксные операторы не ограничиваются встроенными типами, они могут использоваться на ваших собственных типах (хотя не стоит сходить с ума с этой мощью!)
scala> object foo { def unary_~ = "!!!" }
defined module foo
scala> ~foo
res0: java.lang.String = !!!
Итак, что у вас за вопрос? Вы можете проверить индекс ScalaDoc для стандартной библиотеки для методов, начиная с u
. ночной ScalaDoc имеет недавно добавленную документацию для этого метода.
the bitwise negation of this value
Example:
~5 == -6
// in binary: ~00000101 ==
// 11111010