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