2016-08-22 77 views
1

我有點困惑,需要一隻手握住。我可以有一個要執行的函數列表,其中函數採用不同的參數嗎?

如何獲取要運行的函數列表,其中每個函數都可能使用不同的參數集?

例如

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

然後將所有這些函數放入一個List中,然後我可以遍歷並執行它們。

我必須以某種方式描述每個函數的基本接口,然後我可以調用例如運行 ?

+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函數:列表[參數=>()] =列表(p => run1(p.a))''' –

相關問題