首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(数据:任何)=>println(数据)与data:Any=>println(数据)

(数据:任何)=>println(数据)与data:Any=>println(数据)
EN

Stack Overflow用户
提问于 2018-09-24 07:15:40
回答 2查看 65关注 0票数 0

我看到了以下scala代码:

代码语言:javascript
复制
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)的身份写作。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-24 13:37:52

相关规则是

.

第一种情况(case _: Int => data: Any => println(data))满足这个条件,第二种情况不满足。

代码语言:javascript
复制
val y = { data: Any => println(data) }
票数 3
EN

Stack Overflow用户

发布于 2018-09-24 07:57:26

其中一个是case语句与模式匹配,另一个是赋值语句。在第一种情况下,我们实际上是将=>右侧的值(结果)作为语句块返回,如下所示。

代码语言:javascript
复制
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编译器的行为。

代码语言:javascript
复制
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 wayval y : Int = 5

Second wayval y = 5:Int

上述两条赋值语句都是scala中的valid语句。

因为在我们的具体任务声明中。

代码语言:javascript
复制
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,我们可以这样做来编译而不用大括号,

代码语言:javascript
复制
val y : Any => Unit = data =>println(data)


scala> val y : Any => Unit = data =>println(data)
y: Any => Unit = $$Lambda$1059/1854873748@799c8758

希望这能解释为什么要问这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52474320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档