Список «волшебных» функций Scala

Где я могу найти список "волшебных" функций Scala, таких как apply, unapply, update, += и т. д.?

Под магическими функциями я подразумеваю функции, которые используются, например, некоторым синтаксическим сахаром компилятора

o.update(x,y) <=> o(x) = y

Я прибегнул к поиску комбинации scala magic и синонимы functions, но я ничего не нашел.

Меня не интересует использование магических функций в стандартной библиотеке, но существуют магические функции.

71 голос | спросил Elazar Leibovich 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 27 Sep 2009 13:50:40 +0400 2009, 13:50:40

5 ответов


0

Насколько я знаю:

Связанные с геттерами /сеттерами:

apply
update
identifier_=

Сопоставление с образцом:

unapply
unapplySeq

For-постижений:

map
flatMap
filter
withFilter
foreach

Префиксные операторы:

unary_+
unary_-
unary_!
unary_~

Кроме того, любой неявный от A до B. Scala также преобразует A <op>= B в A = A <op> B, если предыдущий оператор не определен, «op» не является буквенно-цифровым, а <op>= не !=, == , <= или >=.

И я не верю, что есть какое-то единственное место, где перечислены все синтаксические сахара в Scala.

ответил Daniel C. Sobral 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 27 Sep 2009 19:01:58 +0400 2009, 19:01:58
0

В дополнение к update и apply есть также ряд унарных операторов, которые (я считаю) квалифицируются как магические:

    unary_+ литий> unary_- литий> unary_! литий> unary_~ литий>

Добавьте к этому обычные инфиксные /суффиксные операторы (которые могут быть практически любыми), и вы получите полный пакет.

Вам действительно стоит взглянуть на спецификацию языка Scala. Это единственный авторитетный источник по этому поводу. Это не так сложно для чтения (если вам удобны грамматики без контекста), и его очень легко найти. Единственное, что он не определяет хорошо, - это поддержка XML.

ответил Daniel Spiewak 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 27 Sep 2009 17:58:39 +0400 2009, 17:58:39
0

Извините, если он не совсем отвечает на ваш вопрос, но мой любимый момент WTF до сих пор - это @ как оператор присваивания внутри сопоставления с образцом. Благодаря мягкой копии «Программирование в Scala» я быстро узнал, что это такое.

Используя @, мы можем связать любую часть шаблона с переменной, и, если совпадение с шаблоном выполнено успешно, переменная захватит значение подшаблона. Вот пример из Программирование в Scala (Раздел 15.2 - Привязка переменных):

expr match {
  case UnOp("abs", e @ UnOp("abs", _)) => e
  case _ =>
}
  

Если все совпадение с шаблоном выполнено успешно,   затем та часть, которая соответствует   UnOp ("abs", _) часть сделана доступной   как переменная е.

И здесь что программирует Scala говорит об этом.

Эта ссылка больше не работает. Здесь . р>

ответил Yardena 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 29 Sep 2009 00:22:11 +0400 2009, 00:22:11
0

Я также добавлю _* для сопоставления с образцом для произвольного числа параметров like

case x: A(_*)

И правило ассоциативности операторов из книги Одерского-Ложки-Веннерса:

  

Ассоциативность оператора в Scala определяется его последним   персонаж. Как уже упоминалось в <...>, любом методе, который заканчивается   в символе «:» вызывается в правом операнде, передавая в   левый операнд Методы, которые заканчиваются на любом другом символе, являются другим   наоборот. Они вызываются на их левом операнде, передавая в   правый операнд Таким образом, a * b возвращает a. * (B), а a ::: b - b. :: :( a).


Возможно, нам следует также упомянуть синтаксическую десагеринг для выражений , который можно найти здесь


И (конечно!), альтернативный синтаксис для пар

a -> b //converted to (a, b), where a and b are instances

(как правильно указано, это всего лишь неявное преобразование , выполняемое через библиотеку, поэтому оно, вероятно, не подходит, но я считаю, что это обычная головоломка для новичков)


ответил pagoda_5b 23 +04002012-10-23T16:50:26+04:00312012bEurope/MoscowTue, 23 Oct 2012 16:50:26 +0400 2012, 16:50:26
0

Я хотел бы добавить, что есть и «волшебная» черта - ---- +: = 0 = + ---- :

  

Черта маркера, которая включает динамические вызовы. Экземпляры scala.Dynamic этой черты разрешают вызовы методов x для произвольных имен методов x.meth(args) и списков аргументов meth, а также доступ к полям args для произвольных имен полей x.field

     

Если вызов field изначально не поддерживается (т. е. если проверка типов не удалась), он переписывается в соответствии со следующими правилами:

x
     

Начиная с Scala 2.10, определение прямых или косвенных подклассов этой черты возможно только при включенной динамике языковых возможностей.

Так что вы можете делать что-то вроде

foo.method("blah")      ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah")  ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2)    ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
foo.field           ~~> foo.selectDynamic("field")
foo.varia = 10      ~~> foo.updateDynamic("varia")(10)
foo.arr(10) = 13    ~~> foo.selectDynamic("arr").update(10, 13)
foo.arr(10)         ~~> foo.applyDynamic("arr")(10)
ответил Petr Pudlák 18 J000000Thursday13 2013, 11:19:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132