为什么 'n = 5 是有效语法?[Scala]

why 'n = 5 is the valid syntax?[Scala]

object solution extends App {
  'n = 5
}

它给出了编译时间错误:value update is not a member of object Symbol println('n = 'n) 这是可以理解的。因为文字是源代码中的固定值。但是上述语法有效的原因是什么?

Welcome to Scala 2.12.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
Type in expressions for evaluation. Or try :help.

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> reify('n)
res0: reflect.runtime.universe.Expr[Symbol] = Expr[Symbol](Symbol.apply("n"))

scala> val a = 'n
a: Symbol = 'n

scala> a = 5
<console>:15: error: reassignment to val
       a = 5
         ^

scala> a.update(5)
<console>:16: error: value update is not a member of Symbol
       a.update(5)
         ^

脱糖,你就会找到答案。

在 Scala 中,运算符是方法。

符号见https://github.com/scala/scala/blob/2.13.x/src/library/scala/Symbol.scala

语法有效的原因是……嗯……因为它是:

implicit class UpdateableSymbol(val s: Symbol.type) extends AnyVal {
  def update[A](s: String, v: A) = println(s"`Symbol.update` called with s = $s and v = $v")
}

'n = 5
// `Symbol.update` called with s = n and v = 5

如你所见,语法绝对没有问题,为什么要无效呢?错误消息告诉您问题所在:您正在调用 Symbol.update 但它不存在。缺少方法不是句法错误,而是语义错误。