Делать методы, заканчивающиеся на _!иметь особое значение в Scala? - PullRequest
10 голосов
/ 22 июня 2010

Имеют ли методы, заканчивающиеся на _!, такие как delete_! или i_is_!, особое значение? Они "просто имена"? Они следуют некоторому соглашению? Там даже bulkDelete_!!. (Конкретный контекст - «Лифт», если он имеет значение.)

Ответы [ 3 ]

17 голосов
/ 23 июня 2010

Я не уверен, что такое соглашение для использования _! и _!! в 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

Любое другое использование символов _ + является условным.

8 голосов
/ 23 июня 2010

Нет особого значения для! в именах Скала. В семье языков, основанных на Лиспе,! часто используется, чтобы указать, что функция имеет побочные эффекты, и это выглядит здесь соглашением.

6 голосов
/ 26 июня 2010

Странно не упомянутое до сих пор (хотя и не особенно уместное для вашего вопроса) унарное_!который лечится специально.

scala> class A { def unary_! = 5 }
defined class A

scala> !(new A)
res0: Int = 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...