gpt4 book ai didi

scala - Scala方法类型和方法作为参数

转载 作者:行者123 更新时间:2023-12-04 13:20:44 25 4
gpt4 key购买 nike

在下面的代码示例中,我不明白为什么可以将fun函数作为参数传递给addAction方法。 fun方法的类型为Unit,而addAction方法的类型为() => Unit

如果fun的类型为() => Unit,那么当我尝试将fun添加到 Action 列表中时,为什么编译器会提示Unit的类型为funactions = fun :: actions

package myscala

object MyScala {

def fun() { println("fun1 executed.") }

def addAction(a: () => Unit) {
actions = a :: actions
}

var actions: List[() => Unit] = List()

def main(args: Array[String]) {
// the following line would produce a compiler error (found: Unit, required: () => Unit), it's OK
// actions = fun :: actions
actions = (() => fun) :: actions // OK
// I would expect the same compiler error here (found: Unit, required: () => Unit), but it's OK why?
addAction(fun)
actions.foreach(_()) // prints twice "fun1 executed"
}
}

最佳答案

以此为介绍性示例:

def fun() { println("fun1 executed.") }

val a1 = fun
val a2: () => Unit = fun

这两行都进行编译,并且(由于类型推断)它们看起来是等效的。但是 a1Unit类型,而 a2() => Unit类型...这怎么可能?

由于未明确提供 a1类型,因此编译器将 fun解释为 fun类型的 Unit方法调用,因此 a1的类型与 fun的类型相同。这也意味着该行将打印fun1执行。

但是, a2已明确声明 () => Unit的类型。编译器在这里为您提供了帮助,并且它了解到,由于上下文需要一个 () => Unit类型的函数,并且您提供了与该类型匹配的方法,因此它不应调用该方法,而应将其视为一流的函数!

您注定不能明确指定 a1的类型。说:
val a1 = fun _

您现在知道问题出在哪里吗?

关于scala - Scala方法类型和方法作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690851/

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