Оператор тильды в Скале - PullRequest
       1

Оператор тильды в Скале

27 голосов
/ 25 февраля 2012

Что ~ делает в этом кусочке Scala?

Например:

scala> val apple = 1
apple: Int = 1

scala> ~apple
res0: Int = -2

Что червь сделал с моим яблоком?

Ответы [ 2 ]

52 голосов
/ 25 февраля 2012

Во-первых, несколько мета-советов. Каждый раз, когда вам интересно, как компилятор расширяет некоторый синтаксический сахар, выводит тип или применяет неявное преобразование, используйте 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
17 голосов
/ 25 февраля 2012

~ является побитовым оператором not при применении к целым числам. Это проще всего увидеть в гексе:

scala> "%x".format( ~0x7F )
res0: String = ffffff80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...