scala - 如何定义接受带有参数的函数的延迟(按名称)参数?

标签 scala language-features delay

我在 David Pollak 的“Beginning Scala” 中看到了一个延迟示例。我试图通过反复试验来适应这一点。这是我所拥有的:

def sayhello() = {
  println("hello")
}

def delaying(t: => Unit):Unit = {
  println("before call")
  t
  println("after call")
}

delaying(sayhello())

您将如何延迟带有参数的函数/方法?为什么我在调用 t 时不能使用括号?在哪里可以找到有关延迟函数的更多文档?

最佳答案

t 不必是函数值。它只是任何计算结果为 Unit 的按名称传递的值。

当您在 delaying 函数中声明 t 时,您并未显式调用作为该参数传递的函数。通过声明它,您将强制对按名称传递的参数进行求值,这意味着 sayhello() 在此时进行求值。

没有理由不能在按名称传递参数的函数中使用参数:

def say(word: String) {
  println(word)
}

def delaying(t: => Unit) {
  println("before call")
  t
  println("after call")
}

delaying(say("hello"))

唯一一次将参数附加到延迟内的t是它的返回类型(不是Unit而是)一个函数输入参数。

关于scala - 如何定义接受带有参数的函数的延迟(按名称)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909026/

相关文章:

c# - LINQ 之后的下一件大事是什么?

c# - C# 中的可变字段

networking - 延迟的数据包可以持续多长时间?

scala - 如何在scala中增加字符

scala - 禁用 sbt 自定义任务的聚合

string - Scala 字符串修剪一组字符

scala - 意外的 "recursive value needs type"编译错误(由本地隐式触发)

c - 使用 for 循环的微 Controller p18f4520 的音频

php - 使用 javascript/ajax 设置延迟