加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 省略括号

发布时间:2020-12-16 10:03:03 所属栏目:安全 来源:网络整理
导读:这是 Scala代码 #1 def method1 = { map1.foreach({ case(key,value) = { println("key " + key + " value " + value) } })} #2 def method1 = { map1.foreach{ case(key,value) = { println("key " + key + " value " + value) } }} 它几乎可以为我所知,但
这是 Scala代码

#1
 def method1 = {
   map1.foreach({
    case(key,value) => { println("key " + key + " value " + value) }
   })
}

 #2
 def method1 = {
   map1.foreach{
    case(key,value) => { println("key " + key + " value " + value) }
   }
}

它几乎可以为我所知,但是我想让它更清楚:为什么在这种情况下可以省略括号?

解决方法

您始终可以在Scala中为花括号交换方法参数括号.例如

def test(i: Int) {}

test { 3 }

其基础是参数表达式的定义,由Scala Language Specification (SLS)的第6.6节部分介绍:

ArgumentExprs ::= ‘(’ [Exprs] ‘)’
                | ‘(’ [Exprs ‘,’] PostfixExpr ‘:’ ‘_’ ‘*’ ’)’
                | [nl] BlockExpr

大括号由最后一个案例(块表达式)覆盖,基本上是'{‘Block’}'(参见第6章SLS的开头).

这不适用于条件表达式,如果,(§6.16SLS)和while循环表达式(§6.17SLS),但它适用于理解(§6.19SLS),有点不一致.

另一方面,必须使用花括号定义模式匹配语句或模式匹配匿名函数文字,例如{case i:Int => i i},这里不允许使用括号(§8.5SLS).

在方法调用中,foreach接受一个函数参数,因此您可以删除多余的括号或双括号:

List(1,2).foreach({ case i => println(i) })
List(1,2).foreach {{ case i => println(i) }}

List(1,2).foreach { case i => println(i) }  // no reason to have double braces

在这种情况下,模式匹配并不能真正为您买任何东西,并且您可以使用常规(非模式匹配)函数,因此以下也可以使用:

List(1,2).foreach(i => println(i)) // §6.23 SLS - anonymous functions
List(1,2).foreach(println)         // §6.26.2 / §6.26.5 - eta expansion

在你的情况下,Map的map方法将key和value的元组传递给函数,这就是你使用模式匹配(case语句)解构那个元组的原因,所以你必然会有花括号.这比写作更好

map1.foreach(tup => println("key " + tup._1 + " value " + tup._2)

作为旁注,在图案匹配案例主体周围放置括号被认为是不好的风格;它们没有必要,即使身体跨越多条线.而不是

case(key,value) => { println("key " + key + " value " + value) }

你应该写

case (key,value) => println("key " + key + " value " + value)

关于在Scala中使用大括号,圆点和圆括号的不同变体,有一些关于in this blog post的论战(“什么不喜欢”一节).最后,你要决定哪种是最好的风格 – 这是人们提倡“自以为是”的语言与“非自以为是”的语言相互斗争的地方.

通常,当表达式跨越多行或者模式匹配时,您需要花括号.当调用具有多个参数列表的方法时,通常最后一个列表包含一个函数参数,因此您可以获得很好的主观判断 – 主观判断:

val l = List(1,2,3)
l.foldLeft(0) {
  (sum,i) => sum + i
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读