我看到了以下scala代码:
val x = 10 match {
case _: Int => data: Any => println(data) // no issue
}
val y = data: Any => println(data) //compiling error在match case子句中,我不必将data: Any => println(data)写成(data: Any) => println(data)
但在val y = data: Any => println(data)中,我必须以val y = (data: Any) => println(data)的身份写作。为什么?
发布于 2018-09-24 13:37:52
相关规则是
第一种情况(case _: Int => data: Any => println(data))满足这个条件,第二种情况不满足。
val y = { data: Any => println(data) }发布于 2018-09-24 07:57:26
其中一个是case语句与模式匹配,另一个是赋值语句。在第一种情况下,我们实际上是将=>右侧的值(结果)作为语句块返回,如下所示。
scala> {data: Any => println(data)}
res0: Any => Unit = $$Lambda$1141/1699449247@71468613
scala> data: Any => println(data)
<console>:1: error: ';' expected but '=>' found.
data: Any => println(data)
scala> val x = 10 match {
| case _: Int => val y = 56;data: Any => println(data) // no issue
| }
x: Any => Unit = $$Lambda$1171/115016870@8f374de上述语句将在=>语句中将statement block视为case语句之后的所有内容,但在第二种情况下(赋值--即赋值函数值)则不是。因此,参数声明前后的括号是必要的。
编辑:
虽然我已经按照我在scala中的观察给出了上面的答案,但我进一步认为它不会清楚地回答为什么?问题的一部分。在研究了当我们键入时得到的准确错误消息之后,我进一步研究了scala编译器的行为。
val y = data:Int => println(data)
scala> val y = data:Int => println(data)
<console>:1: error: ';' expected but '(' found.
val y = data:Int => println(data)这似乎是由于scala的val y类型推断特性所致。
在Scala中,可以在需要的地方显式地指定type,而Scala编译器可以在任何可能的地方隐式地指定infer type。这里,type of y将由scala编译器在第一个实例中推断,因为它在这里没有显式声明。正是由于编译器的这种尝试,发生了上述错误消息。
现在,如果我们想显式声明type,那么scala中就有two ways:
First way:val y : Int = 5
Second way:val y = 5:Int
上述两条赋值语句都是scala中的valid语句。
因为在我们的具体任务声明中。
val y = data:Any => println(data)我们强迫scala用上面所示的type of y第二种方式( Second way )推断出这个。
为了推断出type of y,scala编译器正在尝试如下所述:
在这里,编译器假定data是在这一行代码之前定义的函数,函数的类型是Int=>println(data)。然后它正在检查这种类型的有效性。编译器确定Int是有效类型,但println(data)不是,因为有效的类型名称不能包含括号('(' char),这就是为什么如上所述的error message。
如果我们将上述赋值语句的右侧插入块(即;在大括号之间或将参数声明放在括号内),那么推断type of y就没有问题。
或者使用First way,我们可以这样做来编译而不用大括号,
val y : Any => Unit = data =>println(data)
scala> val y : Any => Unit = data =>println(data)
y: Any => Unit = $$Lambda$1059/1854873748@799c8758希望这能解释为什么要问这个问题。
https://stackoverflow.com/questions/52474320
复制相似问题