scala - 在 Scala 中,什么时候是使用惰性求值参数而不是使用函数作为参数的好时机?

标签 scala anonymous-function lazy-evaluation callbyname call-by-value

def getStr(): String = {
  println("getStr is running")
  "str"
}

def lazyHello(para: => String) = {
  println("lazy hello is runing")
  println(para)
}

def notLazyHello(para: String) = {
  println("not lazy hello is runing")
  println(para)
}

def anoyHello(para: () => String) = {
  println("anoy hello is runing")
  println(para())
}

notLazyHello(getStr)
lazyHello(getStr)
anoyHello(getStr)

得到这个结果:
scala> notLazyHello(getStr)
getStr is running
not lazy hello is runing
str

scala>     lazyHello(getStr)
lazy hello is runing
getStr is running
str

scala>     anoyHello(getStr)
anoy hello is runing
getStr is running
str

似乎 lazyHello 和 anonyHello 执行相同的操作。

那么,在 Scala 中,什么时候是使用惰性求值参数而不是使用函数作为参数的好时机?

最佳答案

你的观察是正确的。 lazyHelloanoyHello事实上是一样的。这是因为 para: => Stringpara: () => String 的简写.

另一种看待这个的方式:
() => String是一个不带参数并返回一个字符串的函数。
=> String是评估为字符串的东西,不带参数。所以本质上 call-by-name 是一个没有输入参数的函数。

关于scala - 在 Scala 中,什么时候是使用惰性求值参数而不是使用函数作为参数的好时机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20072194/

相关文章:

php - WordPress 钩子(Hook)中的匿名函数

php - mysql 查询 php

javascript - 立即调用函数表达式 (IIFE) 与非立即调用函数表达式

scala - 懒惰的 val vs. Scala 中递归流的 val

properties - 惰性的 Kotlin 委托(delegate)属性是线程本地的

scala - 使用scala宏时,为什么编译错误stacktrace看起来如此不连贯?

scala - 是否有任何理由使用 f 有界多态性而不是类型类?

generics - 在泛型方法中返回原始集合类型

Scala Spark 过滤掉重复出现的零值

vb.net - 匿名函数的扩展方法