我有下一个代码,在那里我学习了call by name。
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(“调用fn1 ");”
哈。
发布于 2019-02-14 19:26:37
好吧..。所以你的第一个案例有点奇怪,给你带来了一些困惑。
所以,你的第一个案子,
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的一部分。
https://stackoverflow.com/questions/54677532
复制相似问题