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

时间:2018-11-11 06:00:43

标签: scala syntax literals

object solution extends App {
  'n = 5
}

它给出了编译时间错误:值更新不是对象Symbol的成员 println('n ='n)是可以理解的。因为文字是源代码中的固定值。但是上述语法有效的原因是什么?

2 个答案:

答案 0 :(得分:6)

语法有效的原因是……很好……因为它是

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,但不存在。缺少方法不是语法错误,而是语义错误。

答案 1 :(得分:0)

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