阅读Scala第二版中的编程,我遇到了这个:
文字标识符 “我们的想法是,您可以将运行时接受的任何字符串作为反引号之间的标识符”
我不完全确定为什么要使用它?本书给出了一个在Java的Thread类中访问静态yield方法的用例。
因此,在Scala中,如果我使用带反引号的yield,则yield是一个保留字,
Thread.`yield`()
它会忽略Scala的产量并让我访问Java的Thread类的方法产量而不是?
提前谢谢。
答案 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的任何引用匹配。