object solution extends App {
'n = 5
}
它给出了编译时间错误:值更新不是对象Symbol的成员 println('n ='n)是可以理解的。因为文字是源代码中的固定值。但是上述语法有效的原因是什么?
答案 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