scala – 省略括号
这是
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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |