В вашем вопросе, вы говорите, что вы хотите, массив функций. Но во всем фрагменте кода нет ни одной функции!
Я предполагаю по именам f1
, f2
и f3
что вы считали, что это функции. Но это не так: ключевое слово def
используется для объявления методов, а не функции. Эти два: принципиально разные!
Итак, если вы хотите использовать массив функций, просто сделать f1
, f2
и f3
фактически быть функций вместо методов:
val f1: (Int, Int) => Int = _ + _
val f2: (Int, Int) => Int = _ - _
val f3: (Int, Int) => Int = _ * _
Альтернатива, что будет на самом деле чтения сообщение об ошибке, которое сообщает вам точно, в чем проблема и как исправить:
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, что вы сделать есть массив функций, с помощью, вы знаете, объявив его как массив функций:
val fnList: Array[(Int, Int) => Int] = Array(f1, f2, f3) // or
val fnList = Array[(Int, Int) => Int](f1, f2, f3)
Теперь, Scala знает, что fnList
- это массив функций, он больше не пытается вызвать f1
, вместо этого он преобразует его в функцию.
И что не так с вашей реализацией? – Rogach