【发布时间】:2014-10-21 21:09:58
【问题描述】:
我发现 val a = -1 在 scala REPL 中运行良好,但如果我跳过 = 周围的空格,如 val a=-1,则表达式不会返回结果。
有人对此有想法吗?为什么这里需要= 周围的空间?
【问题讨论】:
标签: scala
我发现 val a = -1 在 scala REPL 中运行良好,但如果我跳过 = 周围的空格,如 val a=-1,则表达式不会返回结果。
有人对此有想法吗?为什么这里需要= 周围的空间?
【问题讨论】:
标签: scala
=- 是 Scala 中的合法方法名;以下将起作用:
class A {
def =-(i: Int) = i
}
val a = new A
a=-1
因此解析器无法将您的val a=-1 与这种情况区分开来。
【讨论】:
=-不是Int的合法方法,scala不应该知道如何正确解析这个表达式吗?
Int 到具有=- 方法的某个对象的隐式转换。一般来说,解析(在这种情况下是技术上的词法分析)发生在编译的早期阶段,早在它知道表达式具有什么类型,甚至源文本的哪些部分是表达式之前。
a=-1,与实际问题val a=-1无关
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的原因是什么?