为什么我在一个案例中获得“扩展函数的缺失参数”而不是另一个案例?

时间:2011-01-15 19:43:57

标签: scala

这种情况有效:

Seq(fromDir, toDir) find (!_.isDirectory) foreach (println(_))

然而这不是:

Seq(fromDir, toDir) find (!_.isDirectory) foreach (throw new Exception(_.toString))

编译以此错误结束:

error: missing parameter type for expanded function ((x$4) => x$4.toString)

现在,如果我这样写它再次编译:

Seq(fromDir, toDir) find (!_.isDirectory) foreach (s => throw new Exception(s.toString))

我确信有合理的解释;)

2 个答案:

答案 0 :(得分:28)

a related question已经解决了这个问题。下划线向外延伸到最接近的结束Expr:括号中的顶级表达式或表达式。

(_.toString)是括号中的表达式。因此,在扩展后,您在错误情况下传递给Exception的参数是(x$1) => x$1.toString类型的完整匿名函数A <: Any => String,而Exception期望String }。

println案例中,_本身不属于语法类别Expr,但是(println (_))是,因此您获得了预期的(x$0) => println(x$0)

答案 1 :(得分:9)

区别在于_是代表整个参数,还是表达式的一部分。根据具体情况,它属于以下两个类别之一:

部分应用功能

Seq(fromDir, toDir) find (!_.isDirectory) foreach (println(_))

转换为

Seq(fromDir, toDir) find (!_.isDirectory) foreach ((x$1) => println(x$1))

匿名函数参数

Seq(fromDir, toDir) find (!_.isDirectory) foreach (throw new Exception(_.toString))

转换为

Seq(fromDir, toDir) find (!_.isDirectory) foreach (throw new Exception((x$1) => x$1.toString))