Я не уверен, что такое соглашение для использования _!
и _!!
в Lift, но вот немного фона.
Любой буквенно-цифровой идентификатор может иметь _ и список добавленных символов, и при этом он может быть проанализирован как один идентификатор. Например:
scala> class Example_!@%*!
defined class Example_$bang$at$percent$times$bang
(На самом деле, вы можете анализировать почти все как идентификатор, если окружаете его обратными чертами - и это то, что вы делаете, если, например, класс Java использует зарезервированное слово Scala. Или если вы хотите использовать пробелы в идентификаторах .)
Однако компилятор распознает только одно символическое окончание. Если есть метод, который выглядит как метод получения, то метод getter_ = будет интерпретироваться как метод установки. (Независимо от того, используете ли вы на самом деле , это зависит от вас; в любом случае, у него будет семантика сеттера.) Так что
scala> class Q { def q = "Hi"; def q_=(s: String) { println(s.reverse) } }
defined class Q
scala> val q = new Q
q: Q = Q@b5c12e
scala> q.q
res0: java.lang.String = Hi
scala> q.q = "Could use this to set something"
gnihtemos tes ot siht esu dluoC
Кроме того, компилятор меняет порядок вызывающего и вызываемого в любом методе, заканчивающемся :
. Это чаще всего наблюдается в списках: newElement :: existingList
на самом деле является вызовом existingList.::(newElement)
. Так, например:
scala> object Caps { def to_:(s: String) = s.toUpperCase }
defined module Caps
scala> "Example" to_: Caps
res40: java.lang.String = EXAMPLE
Любое другое использование символов _
+ является условным.