我发现val a = -1
在scala REPL中运行良好,但是如果我跳过=
周围的空格,如val a=-1
,则表达式不会返回结果。
有没有人有这方面的想法?为什么这里需要=
的空间?
答案 0 :(得分:6)
=-
是Scala中合法的方法名称;以下内容将起作用:
class A {
def =-(i: Int) = i
}
val a = new A
a=-1
因此,解析器无法将您的val a=-1
与此案例区分开来。
答案 1 :(得分:2)
val
用于两种情况:
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方法的普通类),它可以在模式中使用
匹配语法。
让我们看看这是否真的有效:
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)