2015-08-01 1 views
2

я могу быть далеко здесь - но был бы признателен за представление о том, как далеко ..Назначить анонимную функцию методу scala?

В следующем 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 функцию фильтра(), что приводит к Boolean.

Естественно, мы могли бы просто оценить анонимную функцию следующим образом:

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

Но такой подход фактически не replace метод.

Итак: как назначить метод accept анонимной функции filter?

Update сообщение об ошибке

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 и рубин может обрабатывать назначение методов класса для произвольных функций , Но scala требует компиляции, и, таким образом, методы фактически статичны. Будет оценен окончательный ответ на эту догадку.

+0

Исходный код не объяснить компьютеру, как применить фильтр. Вы должны оценить функцию фильтрации внутри метода accept. Для вашего фильтра есть два аргумента. 'override def accept (dir: File, name: String): Boolean = filter (dir, name)' должен это сделать. –

+0

@BobDalgleish, пожалуйста, смотрите OP: я добавил разъяснения, прежде чем ваш комментарий появился, но, вероятно, после того, как вы увидели исходный пост. – javadba

+0

@Paul добавила сообщение об ошибке в OP – javadba

ответ

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) 
} 
+0

ОК, я согласен с этим. Недавно я занимался питоном, так что мне нравились другие привычки. – javadba

0

Я думаю, что вы действительно неправильно понимаете значение ключевого слова override. Он предназначен для переопределения методов, определенных в суперклассе класса, а не для переопределения метода в экземпляре класса.

Если вы хотите, чтобы переопределить метод в случаях FilenameFilter принять, то вам нужно добавить метод фильтра в конструктор класса, как:

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

О, я хорошо знаю значение переопределения. Удивительно, что * не включая * 'override' фактически компилируется вообще. Я бы предположил, что нам нужно сделать это, чтобы анонимный FilenameFilter был правильно реализован. – javadba

+0

Override является необязательным при переопределении метода суперкласса, поскольку он только сигнализирует компилятору, чтобы проверить определение метода в суперклассе, и выбросить ошибку компиляции, когда она не существует или имеет другую подпись. –