Подтвердить что ты не робот

Синтетическая функция "##" в scala

Недавно я увидел некоторый код, похожий на этот код:

val x: Any = "a"
val y = x.## // y: Int = 97

Ну, нормально, результат - это просто значение ASCI 'a', но давайте взглянем на

List(1,2).## // Int = 985731359
List(1,2).toString.## // Int = 1063384434

Моя IDE рассказывает о '##', что это "Синтетическая функция". Итак, что делает ## и что такое синтетическая функция?

4b9b3361

Ответ 1

В основном это псевдоним hashCode, с несколькими примечательными исключениями, которые делают его несколько более безопасным:

Эквивалент x.hashCode, за исключением числовых типов в ящике и null. Для чисел он возвращает хеш-значение, которое соответствует значению равенства: если два экземпляра типа значения сравниваются как истинные, то ## будет выдавать одно и то же значение хэша для каждого из них. Для null возвращает хэш-код, где null.hashCode выбрасывает NullPointerException.

(источник: http://www.scala-lang.org/api/current/index.html#[email protected]##():Int)

Примеры:

нормальное значение

scala> val x: Any = "a"
x: Any = a

scala> x.hashCode
res2: Int = 97

scala> x.##
res3: Int = 97

значение null

scala> null.hashCode
java.lang.NullPointerException
  ... 33 elided

scala> null.##
res5: Int = 0

Вместо этого синтетическое поле является полем, генерируемым компилятором для работы с ограничениями JVM, особенно при работе с внутренними анонимными классами, концепцией, не относящейся к JVM.

Вот хорошее объяснение того, что это означает в деталях: http://javapapers.com/core-java/java-synthetic-class-method-field/