Массив функций? - PullRequest
       0

Массив функций?

10 голосов
/ 18 декабря 2011

Как я могу создать массив функций в Scala, чтобы я мог зацикливать их и вызывать их для выполнения расчетов?

def f1(x: Int, y: Int): Int = x + y

def f2(x: Int, y: Int): Int = x - y

def f3(x: Int, y: Int): Int = x * y

def test() {
   val someValues1 = List(1, 2)
   val someValues2 = List(3, 4)
   val fnList = Array(f1,f2,f3)

   for (f <- fnList; a <- someValues1; b <- someValues2) {
     val result = f(a, b)
     println("Result=" + result)
   }
}

Ответы [ 4 ]

26 голосов
/ 18 декабря 2011

В своем вопросе вы говорите, что хотите массив функций.Но во всем вашем фрагменте кода нет ни одной функции!

По названиям 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, вместо этого он преобразует его в функцию.

7 голосов
/ 18 декабря 2011

Или напишите как:

scala> val fnList = Array(f1 _,f2 _,f3 _)
fnList: Array[(Int, Int) => Int] = Array(<function2>, <function2>, <function2>)
4 голосов
/ 18 декабря 2011

Не ясно, о чем вы спрашиваете, но вы также можете знать, что

val fnList = Array[(Int,Int) => Int](_ + _, _ - _, _ * _)

работает.

4 голосов
/ 18 декабря 2011

Просто укажите параметр Type для вашего массива:

val fnList = Array[(Int,Int)=>Int](f1, f2, f3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...