这种情况有效:
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))
我确信有合理的解释;)
答案 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))