В своем вопросе вы говорите, что хотите массив функций.Но во всем вашем фрагменте кода нет ни одной функции!
По названиям f1
, f2
и f3
я предполагаю, что вы думали, что это были функции.Но это не так: ключевое слово def
используется для объявления методов , а не функций .Эти два принципиально отличаются !
Итак, если вы хотите использовать массив функций, просто сделайте f1
, f2
и f3
на самом деле быть функции вместо методов:
val f1: (Int, Int) => Int = _ + _
val f2: (Int, Int) => Int = _ - _
val f3: (Int, Int) => Int = _ * _
Альтернативой этому может быть read сообщение об ошибке, которое сообщает точно , в чем проблема и какчтобы исправить это:
error: missing arguments for method f1 in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
val fnList = Array(f1,f2,f3)
^
Итак, если вы просто сделаете то, что говорит вам сообщение об ошибке, а именно - конвертируете методы в функции с помощью оператора _
, все будет работать нормально:
val fnList = Array(f1 _, f2 _, f3 _)
Причина, по которой вы получаете сообщение об ошибке, заключается просто в том, что Scala позволяет вам исключить скобки при вызове метода.Итак, f1
просто означает «вызов f1
без списка аргументов», что является ошибкой, поскольку f1
принимает два аргумента.
В некоторых случаях, когда действительно до боли очевидно, что аргумент не может возможно быть ничем , но функцией, Scala автоматически выполнит преобразование из метода в функцию для вас.Итак, третьим вариантом было бы сделать болезненно очевидным для Scala, что у вас do есть массив функций, вы знаете, объявив его как массив функций:
val fnList: Array[(Int, Int) => Int] = Array(f1, f2, f3) // or
val fnList = Array[(Int, Int) => Int](f1, f2, f3)
Теперь, когда Scala знает , что fnList
является массивом функций, он больше не пытается вызвать f1
, вместо этого он преобразует его в функцию.