Я узнал, что параметры и функции по-имени очень похожи. В чем преимущество первых против второго?Параметры или функции по имени?
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
}
UPDATE: Что касается вопроса о том, сколько раз каждый из них выполняет:
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
}
не '() => Int' ленивым? не будет ли '() => Int' выполняться несколько раз? –
'() => Int' не ленив, это призыв к значению. Значение сначала будет вычислено и передано 'myByFunc' –
, а что касается второго вопроса? –