将匿名函数分配给 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)
}
我可能离这里很远 - 但希望能深入了解到底有多远..
在下面的 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)
}