需要澄清斯卡拉文字标识符(反引号)

阅读Scala编程第二版,我碰到这个:

文字标识符“的想法是,你可以把任何被运行时接受的string作为反标之间的标识符”

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

所以既然在斯卡拉,收益是一个保留字,如果我用反引号收益,

Thread.`yield`() 

它会忽略Scala的良率,让我访问Java的Thread类的方法yield?

先谢谢你。

究竟。 使用反引号,你可以或多或less地给一个字段标识符的任何名字。 其实你甚至可以说

 val ` ` = 0 

它定义了一个名字variables (空格的一个字符)。

标识符的字面定义在两种情况下是有用的。 第一种情况是,如果在Scala中已经有一个同名的保留字,并且需要使用一个不关心它的Java库(当然,为什么要这么做)。

另一个用例附带case语句。 约定是,小写字母的名称是指匹配variables,而大写字母的名字是指来自外部作用域的标识符。 所以,

 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"

添加这个最近的问题方法中有一个更高级的用例, 使用尖括号(<>) ,需要反引号来让编译器消化setter方法(本身使用一些“魔术”语法)的代码。

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

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

案子 :

 case Terminated(`child`) 

将types为Terminated的消息与ActorRef字段等同于前面定义的子消息匹配。

有了这个声明:

 case Terminated(c) 

我们将每个Terminated消息与在c中映射的ActorRef的任何引用进行匹配。