名前によるパラメーターと関数は非常に似ていることがわかりました。2番目のものに対する最初のものの利点は何ですか?
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
}
何らかの理由で、両方とも1回実行されます。なんで?
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
}