将匿名函数分配给 Scala 方法?

Assign an anonymous function to a scala method?

我可能离这里很远 - 但希望能深入了解到底有多远..

在下面的 getFiles 方法中,我们有一个匿名函数作为参数传递。

def getFiles(baseDir: String, filter: (File, String) => Boolean ) = {
 val ffilter = new FilenameFilter {
   // How to assign to the anonymous function argument 'filter' ?
   override def accept(dir: File, name: String): Boolean = filter  
 }
 ..

因此 override 是完全不正确的:该语法试图 evaluate 生成布尔值的 filter() 函数。

自然地,我们可以简单地评估匿名函数如下:

 override def accept(dir: File, name: String): Boolean = filter(dir, name)  

但该方法实际上 replace 方法。

那么:如何将accept方法赋值给filter匿名函数呢?

更新错误信息是

Error:(56, 64) type mismatch;
 found   : (java.io.File, String) => Boolean
 required: Boolean
       override def accept(dir: File, name: String): Boolean = filter // { filter(dir, name) }

另一个更新 对此进行更多思考 - 我将采取行动:像 python 和 ruby 这样的动态语言可以处理 class 方法到任意函数。但是 scala 需要编译,因此这些方法实际上是静态的。对此直觉的明确答案将不胜感激。

我认为您实际上误解了 override 关键字的含义。 它用于重新定义在 class 的 superclass 中定义的方法,而不是在 class.

的实例中重新定义方法

如果要在 FilenameFilter 的实例中重新定义 accept 方法,则需要将 filter 方法添加到 class 的构造函数中,例如:

class FilenameFilter(val filter: (File, String) => Boolean) {
  def accept(dir: File, name: String): Boolean = filter(dir, name)
}

没有简单或类型安全的方法(据我所知)将函数分配给方法,因为它们是不同的类型。在 Python 或 JavaScript 你可以这样做:

var fnf = new FilenameFilter();
fnf.accepts = filter;

但是在 Scala 中你必须做委托:

val fnf = new FilenameFilter {
   override def accept(dir: File, name: String): Boolean = filter(dir, name) 
 }