【问题标题】:Why "val a=-1" doesn't work in scala?为什么“val a=-1”在 scala 中不起作用?
【发布时间】:2014-10-21 21:09:58
【问题描述】:

我发现 val a = -1 在 scala REPL 中运行良好,但如果我跳过 = 周围的空格,如 val a=-1,则表达式不会返回结果。

有人对此有想法吗?为什么这里需要= 周围的空间?

【问题讨论】:

    标签: scala


    【解决方案1】:

    =- 是 Scala 中的合法方法名;以下将起作用:

    class A {
      def =-(i: Int) = i
    }
    val a = new A
    a=-1
    

    因此解析器无法将您的val a=-1 与这种情况区分开来。

    【讨论】:

    • 但是=-不是Int的合法方法,scala不应该知道如何正确解析这个表达式吗?
    • 可能存在从Int 到具有=- 方法的某个对象的隐式转换。一般来说,解析(在这种情况下是技术上的词法分析)发生在编译的早期阶段,早在它知道表达式具有什么类型,甚至源文本的哪些部分是表达式之前。
    • @Imm 在这种情况下,您的解释是针对a=-1,与实际问题val a=-1无关
    • @ShyamendraSolanki 我怀疑这发生在词法分析阶段,在这种区别变得相关之前。
    【解决方案2】:

    val在2种情况下使用:

    1) 值声明:

    val a = 2
    > a: Int = 2
    

    2) 模式定义:

    val Some(x) = Some(2)
    > x: Int = 2
    

    当你写val a=-1时,明显不匹配“值声明”语法,所以编译器尝试“模式定义”语法。

    要看到这种情况,让我们在行尾加一个分号。

     val a=-1 ;
     > <console>:1: error: '=' expected but ';' found.
    

    确实,编译器正在寻找模式定义的右侧。

    现在请注意,=- 是一个有效的标识符名称。 所以如果是case类(或者普通类有unapply方法),可以在pattern中使用 匹配语法。

    让我们看看这是否真的有效:

    case class =- (i: Int, j: Int)
    > defined class $eq$minus
    
    val a =- b = =-(2, 3)  // infix syntax for pattern match
    > a: Int = 2
      b: Int = 3
    
    // Yes. it works!
    
    // This is same as:
    val =-(a, b) = =-(2, 3) 
    

    【讨论】:

    • when you write val a=-1, it clearly fails to match the "value declaration" syntax的原因是什么?
    猜你喜欢
    • 2019-09-26
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2021-10-21
    • 1970-01-01
    • 2015-12-30
    • 2018-10-27
    相关资源
    最近更新 更多