gpt4 book ai didi

scala - Scala 中的多行函数文字作为参数

转载 作者:行者123 更新时间:2023-12-02 20:39:39 26 4
gpt4 key购买 nike

我一直想知道为什么有时使用函数文字我们可以忽略大括号,甚至对于多个语句也是如此。为了说明这一点,多行函数文字的语法是将语句用大括号括起来。就像这样,

val fl = (x: Int) => {
println("Add 25 to "+x)
x + 25
}

但是,当您将其传递给单参数函数时,您可以忽略函数文字所需的大括号。

因此对于给定的函数 f,

def f( fl: Int => Int ) {
println("Result is "+ fl(5))
}

你可以像这样调用f(),

f( x=> {
println("Add 25 to "+x)
x + 25
})
-------------------------
Add 25 to 5
Result: 30

或者,当您在函数调用中使用大括号而不是括号时,可以从函数文字中删除内部大括号。所以下面的代码也可以工作,

f{ x=>
println("Add 25 to "+x)
x + 25
}

上面的代码更具可读性,我注意到很多示例都使用这种语法。但是,是否有任何我可能错过的特殊规则来解释为什么它按预期工作?

最佳答案

只有一些简单的语法规则。该规范的附录值得仔细阅读。

函数文字或匿名函数 (6.23) 看起来像 x => Exprx => Block,具体取决于上下文是 Expr 还是 ResultExpr,分别。

函数应用程序 (6.6) 看起来像 f(Expr, Expr)f BlockExpr,即 f{ Block }。也就是说,BlockExpr 只是 {...} 内的一系列 block 语句。

当您调用f(g)时,g是一个Expr,因此作为函数文字,x => Expr。 Expr 可以是 BlockExpr,x => { ... }

当您调用 f{ Block } 时,f { x => ... } 在 Block 的 ResultExpr 中具有函数文字(这只是一个序列语句,不需要大括号)。

在这里,很明显 anon 函数位于 block 的底部:

scala> def m(x: Int=>Int) = x(5)
m: (x: Int => Int)Int

scala> m {
| val y = 7
| x => // no brace
| x+y+1
| }
res0: Int = 13

关于scala - Scala 中的多行函数文字作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13872196/

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