gpt4 book ai didi

scala - 下划线后的功能?

转载 作者:行者123 更新时间:2023-12-04 16:38:52 25 4
gpt4 key购买 nike

给定

scala> def method(x: Int) = x
method: (x: Int)Int

scala> val func = (x: Int) => x
func: Int => Int = <function1>

考虑以下代码:
scala> method _
res0: Int => Int = <function1>

scala> func(_)
res1: Int => Int = <function1>

scala> func _
res2: () => Int => Int = <function0>

我可以理解 res0是eta扩展,并且 res1等同于lambda函数 (x) => func(x)。但是我不知道 res2的输出。有人可以帮我解释一下吗?

最佳答案

这实际上有点棘手。首先,让我们看看REPL之外会发生什么:

func是局部变量时,它不起作用:

object Main extends App {
def foo() = {
val f = (_: Int) + 1
f _
}

println(foo())
}

[error] /tmp/rendereraEZGWf9f1Q/src/main/scala/test.scala:8: _ must follow method; cannot follow Int => Int
[error] f _
[error] ^

但是,如果将其放在 def foo之外,则会编译:
object Main extends App {
val f = (_: Int) + 1
val f1 = f _

println(f1)
}

因为 f既是 Main的字段,又是不带参数的方法,该方法返回该字段的值。

最后一点是REPL将每一行都包装到一个对象中(因为Scala不允许代码出现在trait/class/object之外),因此
scala> val func = (x: Int) => x
func: Int => Int = <function1>

真的像
object Line1 {
val func = (x: Int) => x
}
import Line1._
// print result

因此,下一行的 func指的是 Line1.func,这是一种方法,因此可以进行eta扩展。

关于scala - 下划线后的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39573823/

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