0

我对 Scala 很陌生,我想将一个函数添加到列表中。我有以下内容:

  var l2: List[() => Unit] = List()
  def foo() {
    println("In foo")
  }

现在我想在列表中添加一个方法。

() => println("x") :: l2

它可以编译,但在运行时不起作用。

下一个问题:为什么以下内容不编译?

l2 = foo :: l2

谢谢。

4

2 回答 2

1

这不是正确的语法

() => println("x") :: l2

正确的是

(() => println("x")) :: l2

为什么l2 = foo :: l2不编译是因为foo不符合l2的类型深入理解它尝试以下

foo.toString

但是将编译以下内容

var fn = {() => println("y")}
l2 = fn :: l2

或者

foo _ :: l2
于 2013-06-06T21:38:55.973 回答
0

首先,() => println("x") :: l2被解释为() => (println("x") :: l2)。这是一个不带参数并返回 a List[Any](在类型推断之后)的函数。

正如@dursun 所说,你想写:

(() => println("x")) :: l2

此外,l2 = foo :: l2如果您使用函数值而不是应用它(基本上是为了保护程序员免受误用),则不会编译,因为 Scala 希望您明确声明。采用:

foo _ :: l2
于 2013-06-06T22:03:16.407 回答