我对 Scala 很陌生,我想将一个函数添加到列表中。我有以下内容:
var l2: List[() => Unit] = List()
def foo() {
println("In foo")
}
现在我想在列表中添加一个方法。
() => println("x") :: l2
它可以编译,但在运行时不起作用。
下一个问题:为什么以下内容不编译?
l2 = foo :: l2
谢谢。
我对 Scala 很陌生,我想将一个函数添加到列表中。我有以下内容:
var l2: List[() => Unit] = List()
def foo() {
println("In foo")
}
现在我想在列表中添加一个方法。
() => println("x") :: l2
它可以编译,但在运行时不起作用。
下一个问题:为什么以下内容不编译?
l2 = foo :: l2
谢谢。
这不是正确的语法
() => println("x") :: l2
正确的是
(() => println("x")) :: l2
为什么l2 = foo :: l2
不编译是因为foo
不符合l2的类型深入理解它尝试以下
foo.toString
但是将编译以下内容
var fn = {() => println("y")}
l2 = fn :: l2
或者
foo _ :: l2
首先,() => println("x") :: l2
被解释为() => (println("x") :: l2)
。这是一个不带参数并返回 a List[Any]
(在类型推断之后)的函数。
正如@dursun 所说,你想写:
(() => println("x")) :: l2
此外,l2 = foo :: l2
如果您使用函数值而不是应用它(基本上是为了保护程序员免受误用),则不会编译,因为 Scala 希望您明确声明。采用:
foo _ :: l2