需要澄清Scala文字标识符(反引号)

时间:2011-07-04 22:37:40

标签: scala

阅读Scala第二版中的编程,我遇到了这个:

文字标识符 “我们的想法是,您可以将运行时接受的任何字符串作为反引号之间的标识符”

我不完全确定为什么要使用它?本书给出了一个在Java的Thread类中访问静态yield方法的用例。

因此,在Scala中,如果我使用带反引号的yield,则yield是一个保留字,

Thread.`yield`()

它会忽略Scala的产量并让我访问Java的Thread类的方法产量而不是?

提前谢谢。

2 个答案:

答案 0 :(得分:107)

完全。使用反引号,您可以或多或少地为字段标识符指定任何名称。事实上,你甚至可以说

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"

添加在最近的问题method with angle brackets (<>)中有一个更高级的用例,需要反引号来让编译器消化setter方法的代码(它本身使用了一些'魔术'语法)。

答案 1 :(得分:16)

谢谢@Debilski,它帮助我从AKKA doc了解下面这段代码:

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

案例:

case Terminated(`child`)

匹配Terminated类型的消息,其中ActorRef字段等于之前定义的child。

这句话:

case Terminated(c)

我们将每个已终止的消息与在 c 中映射的ActorRef的任何引用匹配。