需要澄清斯卡拉文字标识符(反引号)
阅读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的任何引用进行匹配。