具有2个功能的CallByName

时间:2019-02-13 18:59:30

标签: scala

我有下一个代码,我在其中学习按名称呼叫。

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”);“

嗯。

1 个答案:

答案 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的一部分。