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