Требуется разъяснение по буквальным идентификаторам Scala (обратные ссылки) - PullRequest
54 голосов
/ 05 июля 2011

Читая Программирование в Scala 2nd Ed, я наткнулся на это:

буквенный идентификатор «Идея состоит в том, что вы можете поместить любую строку, которая принимается средой выполнения, в качестве идентификатора между обратным тэгом»

Я не совсем уверен, зачем мне это использовать? В книге приведен пример использования статического метода yield в классе Thread Java.

Так как в Scala yield - это резервное слово, если я использую yield с обратными чертами,

Thread.`yield`()

это проигнорирует выход Scala и позволит мне вместо этого получить доступ к выходу метода Java-класса класса Thread?

Заранее спасибо.

Ответы [ 2 ]

109 голосов
/ 05 июля 2011

Точно.Используя обратные пометки, вы можете более или менее присвоить любое имя идентификатору поля.Фактически, вы можете даже сказать

val ` ` = 0

, который определяет переменную с именем (один символ пробела).

Буквальное определение идентификаторов полезно в двух случаях.Первый случай, когда в Scala уже есть зарезервированное слово с тем же именем, и вам нужно использовать библиотеку Java, которая не заботится об этом (и, конечно, зачем это нужно).

ДругойВариант использования поставляется с case заявлениями.Соглашение состоит в том, что имена нижнего регистра ссылаются на переменные соответствия, тогда как имена верхнего регистра ссылаются на идентификаторы из внешней области видимости.Итак,

val A = "a"
val b = "b"
"a" match {
  case b => println("b")
  case A => println("A")
}

печатает "b" (если бы компилятор был достаточно глуп, чтобы не сказать, что case A недоступен).Если вы хотите сослаться на первоначально определенный val b, вам необходимо использовать обратные метки в качестве маркера.

"a" match {
  case `b` => println("b")
  case A => println("A")
}

Который печатает "A".

Добавить В этом недавнем методе с угловыми скобками (<>) есть более продвинутый вариант использования, где обратные метки были необходимы, чтобы компилятор переваривал код для метода метода set (который сам по себе использует некоторую «магию»).'синтаксис).

16 голосов
/ 23 августа 2013

Спасибо @Debilski, это помогает мне понять этот код ниже из документа AKKA:

class WatchActor extends Actor {
    val child = context.actorOf(Props.empty, "child")
    ...
    def receive = {
        ...
        case Terminated(`child`) ⇒ ...
    }
}

Корпус:

case Terminated(`child`)

соответствует сообщению типа Завершено с полем ActorRef, равным потомку, который определен ранее.

С этим утверждением:

case Terminated(c)

Мы сопоставляем каждое завершенное сообщение с любой ссылкой ActorRef, отображенной в c .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...