我发现名字参数和功能非常相似。第一个对第二个有什么优势?
object ws1 {
def myByFunc(f: () => Int) = f() //> myByFunc: (f: () => Int)Int
def myByName(f: => Int) = f //> myByName: (f: => Int)Int
def testFunc(a: Int) = a * a //> testFunc: (a: Int)Int
myByFunc(() => testFunc(123)) //> res0: Int = 15129
myByName(testFunc(123)) //> res1: Int = 15129
}
更新: 关于每个人执行多少次的问题:
object ws1 {
def myByFunc(f: () => Int) = {
println("111111111 myByFunc")
f()
} //> myByFunc: (f: () => Int)Int
def myByName(f: => Int) = {
println("22222222 myByName")
f
} //> myByName: (f: => Int)Int
def testFunc(a: Int) = a * a //> testFunc: (a: Int)Int
myByFunc(() => testFunc(123)) //> 111111111 myByFunc
//| res0: Int = 15129
myByName(testFunc(123)) //> 22222222 myByName
//| res1: Int = 15129
}
由于某种原因,他们都执行了一次。为什么呢?
UPDATE2: 他们都没有被评估:
object ws1 {
def myByFunc(f: () => Int) = {
println("111111111 myByFunc")
} //> myByFunc: (f: () => Int)Unit
def myByName(f: => Int) = {
println("22222222 myByName")
} //> myByName: (f: => Int)Unit
def testFunc(a: Int) = {
println("hello from test func")
123456
} //> testFunc: (a: Int)Int
myByFunc(() => testFunc(123)) //> 111111111 myByFunc
myByName(testFunc(123)) //> 22222222 myByName
}
答案 0 :(得分:1)
看起来很相似但意图不同:
() => Int
是函数,更确切地说是Function0
:它不带参数并返回Int
。函数的执行通过调用f()来触发。
=> Int
是参数,使用按名称调用技术传递:评估将是懒。永远无法评估代码:def myByName(f: => Int) = 1
或多次评估:def myByName(f: => Int) = f * f
。
要获得更完整的解释,请查看以下问题:What's the difference between => , ()=>, and Unit=>