gpt4 book ai didi

scala - 省略括号

转载 作者:行者123 更新时间:2023-12-01 01:08:01 24 4
gpt4 key购买 nike

这是 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 的开头)。

这不适用于条件表达式, if ,(第 6.16 节 SLS)和 while循环表达式(第 6.17 节 SLS),但它适用于 for理解(§6.19 SLS),有点不一致。

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

在您的方法调用中, 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

但是,在您的情况下,是 Mapmap方法将键和值的元组传递给函数,这就是为什么您使用模式匹配( 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)

有一点争论 in this blog post关于在 Scala 中使用大括号、点和括号的不同变体(“不喜欢什么”部分)。最后,您要决定哪种风格最好——这就是提倡“固执”语言和“非固执”语言的人们相互争斗的地方。

通常,当表达式跨越多行或有模式匹配时,您需要花括号。当调用具有多个参数列表的方法时,通常最后一个列表包含一个函数参数,所以你会很漂亮——当然是主观判断——语法:
val l = List(1, 2, 3)
l.foldLeft(0) {
(sum, i) => sum + i
}

关于scala - 省略括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17210846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com