{println("hi"); print-6ren">
gpt4 book ai didi

scala - 匿名函数作为参数

转载 作者:行者123 更新时间:2023-12-04 19:31:08 27 4
gpt4 key购买 nike

def fun(f: Int => Unit) {
f(10)
f(20)
}
println("method 1 call:")
fun(i => {println("hi"); println(i)})
println("method 2 call:")
fun{println("hi"); println(_)}

输出是:

E:\test\scala>scala i.scala
method 1 call:
hi
10
hi
20
method 2 call:
hi
10
20

我认为 i => {println("hi"); println(i)}println("hi"); println(_) 是一样的。因为我们只有一个参数,而且参数只使用一次,所以我们可以使用_来简化代码。

那么,为什么方法2只打印一次“hi”呢?(意思是:如果我想用_来简化调用,=>右边的内容只能有一个表达式,如果有多个, e.g. println("hi"); println(i); 那么,我们能不能用_来代替?

最佳答案

println(_) 扩展为 x => println(x),所以 {println("hi"); println(_)} 扩展为 {println("hi"); x => println(x)}。所以当 fun{println("hi"); println(_)} 执行,执行以下步骤:

  1. 表达式 {{println("hi"); println(_)}} 被评估。这意味着:

    1. println("hi") 求值然后
    2. x => println(x) 被评估,创建一个将打印其参数的函数对象。
    3. 这样创建的函数对象就是表达式的结果。
  2. func 方法以创建的函数对象作为参数调用。 func 将调用带有 1020 的函数,使其打印这些数字。

关于scala - 匿名函数作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37500681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com