首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有2个函数的CallByName

具有2个函数的CallByName
EN

Stack Overflow用户
提问于 2019-02-14 02:59:30
回答 1查看 50关注 0票数 2

我有下一个代码,在那里我学习了call by name。

代码语言:javascript
复制
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))

我期望相同的输出,但它是:

代码语言:javascript
复制
calling fn1
fn1: Int => Int = <function>89c5c0

101
101

=================

fn2: Int => Int = <function>d15e781

calling fn2
101
calling fn2
101

我知道第二种情况是“字面函数(也称为匿名函数)”。

你能告诉我在哪里可以读到这两个案例或解释一下吗?谢谢。

第三种情况:

代码语言:javascript
复制
val fn1 : (Int => Int) = {println("calling fn1 "); _ + 100}

println(fn1(1))
println(fn1(2))
println(fn1(3))

输出:

代码语言:javascript
复制
calling fn1
fn1: Int => Int = <function>da62626

101
102
103

在最后一种情况下,“函数体执行了3次”,但仅最后部分"_ + 100“和第一部分仅执行了1次”println(“调用fn1 ");”

哈。

EN

回答 1

Stack Overflow用户

发布于 2019-02-14 19:26:37

好吧..。所以你的第一个案例有点奇怪,给你带来了一些困惑。

所以,你的第一个案子,

代码语言:javascript
复制
val fn1 : (Int => Int) = {
  println("calling fn1 ")
  _ + 100
}

实际上,

代码语言:javascript
复制
val fn1 : (Int => Int) = {
  println("calling fn1 ")
  val xx: Int => Int = _ + 100
  xx
}

类似于,

代码语言:javascript
复制
val i: Int = {
  println("creating int")
  5
}

因此,您的fn1就是那个xx。这与println("calling fn1 ")线路无关。

与第二种情况一样,println("calling fn2 ")也是fn2的一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54677532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档