为什么" val a = -1"在scala中不起作用?

时间:2014-10-21 09:33:54

标签: scala

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

有没有人有这方面的想法?为什么这里需要=的空间?

2 个答案:

答案 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)