我有下一个代码,我在其中学习按名称呼叫。
def callByName(v1: => Int) ={
println(v1)
println(v1)
}
val fn1 : (Int => Int) = {println("calling fn1 "); _ + 100}
callByName(fn1(1))
println("=================")
val fn2 = (x: Int) => {println("calling fn2 "); x + 100 }
callByName(fn2(1))
我希望得到相同的输出,但它是:
calling fn1
fn1: Int => Int = <function>89c5c0
101
101
=================
fn2: Int => Int = <function>d15e781
calling fn2
101
calling fn2
101
我知道第二种情况是“函数文字(也称为匿名函数)”。
您能否告诉我在哪里可以阅读这两个案例或进行解释?谢谢。
第三种情况:
val fn1 : (Int => Int) = {println("calling fn1 "); _ + 100}
println(fn1(1))
println(fn1(2))
println(fn1(3))
输出:
calling fn1
fn1: Int => Int = <function>da62626
101
102
103
在这最后一种情况下,“函数主体执行了3次”,但只有最后一部分“ _ + 100”和第一部分只有1次“ println(“ calling fn1”);“
嗯。
答案 0 :(得分:1)
好吧...所以您的第一种情况有点怪异,给您带来一些困惑。
第一个情况,
val fn1 : (Int => Int) = {
println("calling fn1 ")
_ + 100
}
实际上是
val fn1 : (Int => Int) = {
println("calling fn1 ")
val xx: Int => Int = _ + 100
xx
}
类似于,
val i: Int = {
println("creating int")
5
}
因此,您的fn1
就是那个xx
。它与println("calling fn1 ")
行没有关系。
与您的第二种情况一样,println("calling fn2 ")
也是fn2
的一部分。