2016-08-22 1 views
1

Я немного смущен и нуждаюсь в небольшой руке.Могу ли я иметь список функций для выполнения, где функции принимают разные параметры?

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

например.

def run1(a: Int)... 
def run2(b:Int, c: Int) ... 
def run3(x: Boolean) ... 

И затем все эти функции включены в список, который я мог бы затем пропустить и выполнить их все.

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

+0

Вы можете перегрузить одну функцию в то время как они имеют разные параметры. – raven

ответ

4

Вот один из способов может быть адрес Ваш вопрос:

sealed trait Functions 
case class Fun1(f: Int => Int)  extends Functions 
case class Fun2(f: (Int, Int) => Int) extends Functions 

// first function adds 42 to input 
// second function adds the two inputs 
val xs: List[Functions] = List(Fun1(_ + 42), Fun2(_ + _)) 

А потом вот пример того, как раз за List[Functions].

Этот пример выбирает произвольные входные данные для функций, а затем добавляет их вместе.

scala> xs.foldLeft(0){ (acc, elem) => elem match { 
    | case Fun1(f) => f(42) + acc 
    | case Fun2(g) => g(10, 20) + acc 
    | } 
    | } 
res1: Int = 114 
0

Существует еще один вариант вместо функций сопоставления рисунка. Вы можете перенести ответственность за принятие решений на этап создания списка.

Идея состоит в том, чтобы создать общий интерфейс для параметра, который объединяет все функции.

case class Parameter(a: Int, b:Int, c:Int, d:Boolean ...) 

val functions: List[Parameter => Unit] = List(
    p => run1(p.a), 
    p => run2(p.b, p.c), 
    p => run3(p.d), 
    ...) 

Позже, когда данные готовы это могут быть объединены в Parameter объекта и переданы функции

val param:Parameter = //aggregation of data 

functions.foreach(f => f(param)) 
+0

Итак, это пример запуска нескольких функций с одинаковыми параметрами? –

+0

Правильно, это идея - адаптировать функции к одному и тому же параметру –

+0

Я получаю сообщение об ошибке '' 'scala> val функции: List [Parameters =>()] = List (p => run1 (pa)) : 1: ошибка: '=>' ожидается, но ']' найден. функции val: List [Parameters =>()] = List (p => run1 (p.a)) '' ' –