【问题标题】:why 'n = 5 is the valid syntax?[Scala]为什么'n = 5 是有效的语法?[Scala]
【发布时间】:2018-11-11 06:00:42
【问题描述】:
object solution extends App {
  'n = 5
}

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

【问题讨论】:

  • 如果我尝试在没有环绕 object 的情况下编译它,IntelliJ IDE 工作表会给出不同的错误:identifier expected but symbol literal found
  • 那个错误比这个更具体,但你不认为这应该不是有效的语法吗? @jwvh

标签: scala syntax literals


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    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

    【讨论】:

    • 我不是在问为什么它给我编译时错误,我是在问为什么这个语法甚至是有效的?我明白为什么它给了我错误。
    • 运算符是方法。我刚刚更新了我的答案。
    • @RamanMishra 编译器在编译时发现错误是个好主意。
    • 运算符是方法'(文字运算符)调用 Symbol 类的构造函数并创建一个符号,我仍然没有得到根据我的说法为文字重新分配值的点,这不应该是有效的语法。
    • 这是有效语法的原因是它是Symbol.update("n", 5) 的语法糖,这是完全合法、有效、合理的语法。解析器不知道、不关心、也不应该关心方法调用是否合法,它应该只关心语法是否合法。它是什么。
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多