我可能会离开这里 - 但是会很高兴看到有多远......
在下面的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需要编译,因此这些方法实际上是静态的。对这种预感的肯定答案将不胜感激。
答案 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)
}