Возможно, это видео могло бы помочь пролить некоторый свет для Вас:-)
http://channel9.msdn.com/posts/Charles/The-Concurrency-Runtime-Fine-Grained-Parallelism-for-C/
Насколько мне известно:
Связанные с геттерами / сеттерами:
apply
update
identifier_=
Сопоставление с образцом:
unapply
unapplySeq
Формальное понимание:
map
flatMap
filter
withFilter
foreach
Операторы с префиксом:
unary_+
unary_-
unary_!
unary_~
Помимо этого, любые неявно из A в B. Scala также преобразует A
в A = A
, если первый оператор не определен, "op" будет не буквенно-цифровое, и
не ! =
, ==
, <=
или > =
.
И я не верю, что есть какое-то одно место, где перечислены все синтаксические сахара Scala.
They are defined in the Scala Language Specification. Насколько мне известно, как вы упомянули, существует всего три «магических» функции.
Скалы Getter и Setter также могут иметь отношение к вашей «магии»:
scala> class Magic {
| private var x :Int = _
| override def toString = "Magic(%d)".format(x)
| def member = x
| def member_=(m :Int){ x = m }
| }
defined class Magic
scala> val m = new Magic
m: Magic = Magic(0)
scala> m.member
res14: Int = 0
scala> m.member = 100
scala> m
res15: Magic = Magic(100)
scala> m.member += 99
scala> m
res17: Magic = Magic(199)
In addition to update
and apply
, there are also a number of unary operators which (I believe) qualify as magical:
unary_+
unary_-
unary_!
unary_~
Add to that the regular infix/suffix operators (which can be almost anything) and you've got yourself the complete package.
You really should take a look at the Scala Language Specification. It is the only authoritative source on this stuff. It's not that hard to read (as long as you're comfortable with context-free grammars), and very easily searchable. The only thing it doesn't specify well is the XML support.
Извините, если это не совсем ответ на ваш вопрос, но пока что мой любимый WTF-момент - это @ как оператор присваивания внутри сопоставления с образцом. Благодаря электронной копии «Программирования на Scala» я довольно быстро узнал, что это было.
Используя @, мы можем привязать любую часть шаблона к переменной, и если совпадение с шаблоном будет успешным, переменная будет фиксировать значение подшаблон. Вот пример из Программирование на Scala (Раздел 15.2 - Привязка переменных):
expr match {
case UnOp("abs", e @ UnOp("abs", _)) => e
case _ =>
}
Если все сопоставление с образцом выполнено успешно, затем часть, которая соответствует Часть UnOp ("abs", _) сделана доступной в качестве переменной e.
И здесь , что говорит об этом Programming Scala
Эта ссылка больше не работает. Здесь тот, который работает.