为scala方法分配匿名函数?

时间:2015-08-01 23:46:59

标签: scala anonymous-function

我可能会离开这里 - 但是会很高兴看到有多远......

在下面的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这样的动态语言可以处理任意函数的类方法。但是scala需要编译,因此这些方法实际上是静态的。对这种预感的肯定答案将不胜感激。

2 个答案:

答案 0 :(得分:1)

没有办法简单或类型安全的方式(我知道)为函数分配一个函数,因为它们是不同的类型。在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) 
 }

答案 1 :(得分:0)

我认为你实际上误解了override关键字的含义。 它用于重新定义类的超类中定义的方法,而不是重新定义类实例中的方法。

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

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