gpt4 book ai didi

scala - 在花括号之间将函数作为代码块传递

转载 作者:行者123 更新时间:2023-12-03 08:28:22 26 4
gpt4 key购买 nike

有几次我看到这样的 Scala 代码:

object Doer{
def doStuff(op: => Unit) {
op
}
}

以这种方式调用:
Doer.doStuff{
println("Done")
}

对我来说奇怪的是,一个函数是如何传递给另一个函数的,只是花括号之间的一段代码。甚至没有通常标记参数列表开始和结束的括号。

这个 Scala 语法/功能的名称是什么?在什么情况下我可以使用它?它记录在哪里?

最佳答案

这称为空函数或 thunk,是按名称调用评估的示例:http://www.scala-lang.org/old/node/138

您几乎可以在任何有参数列表的地方使用 nullaries。它们基本上只是零参数函数周围的语法糖,使它们看起来像普通值,并且在它们被引用时被调用。

所以

def doSomething(op: => Unit) {
op
}
doSomething {
println("Hello!")
}

与以下内容完全相同:
def doSomething(op: () => Unit) {
op()
}
doSomething(() => println("Hello!"))

使用空值时要记住的一件事是每次引用它们时都会调用它们,例如:
def foo(op: => Int) = op + op
foo {
println("foo")
5
}

将打印“foo”两次。

编辑 :为了扩展 Randall 的评论,nullary 函数与零参数函数的最大区别之一是 nullaries 不是一等值。例如,您可以有一个 List[() => Int]但你不能有 List[=> Int] .如果你有类似的东西:
def foo(i: => Int) = List(i)

您没有将 nullary 函数添加到列表中,而只是将其返回值添加到列表中。

关于scala - 在花括号之间将函数作为代码块传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22670356/

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