2017-09-03 64 views
1

我有以下代碼Scala的功能:呼叫內的可變

def func1 : Mylass = ... 
def func2 : Mylass = ... 
def func3 : Mylass = ... 

def function : List[MyClass] = { 
    val funcs = List(func1, func2, func3) 
    for { 
     f <- funcs 
     result = [??? What I shall put here ???] 
    } yield result 
} 

for循環的目的是調用通過一個存儲的內部f一個的功能。但我不知道我要放什麼來「調用存儲在變量f內部的函數」。

我試圖把:

result = f() 

但我的IDE提供了編譯錯誤。

非常感謝。

回答

0

您的funcs變量實際上是調用func1,func2func3的結果列表。這些是函數定義。你需要告訴編譯器把它們作爲函數值,像這樣:

def func1 : String = ??? 
    def func2 : String = ??? 
    def func3 : String = ??? 

    def function : List[String] = { 
    val funcs = List(func1 _, func2 _, func3 _) 
    for { 
     f <- funcs 
     result = f() 
    } yield result 
    } 

你可以只yield f()

或者改變你的函數定義以函數值:

val func1 :() => String = ??? 
    val func2 :() => String = ??? 
    val func3 :() => String = ??? 

    def function : List[String] = { 
    List(func1, func2, func3).map(_.apply()) 
    } 
0

你寫什麼都要工作。 不確定你的問題到底是什麼,因爲你既沒有顯示完整的代碼示例,也沒有顯示你得到的實際錯誤信息。

這編譯:

def foo: String = ??? 
def bar: List[String] = for { 
    f <- List(foo _) 
    result = f() 
} yield result 

UPDATE啊,我意識到什麼是你的代碼錯誤,閱讀對方的回答後:List(foo)創建在這種情況下String(援引foo的結果)的列表(因爲foo被聲明爲沒有括號),List(foo _)是一個函數列表,返回String。 所以,你寫它的方式,fString,所以f()沒有意義。 另一方面,在我的代碼片段中,f是一個函數,f()會調用它。

+0

如果for理解是在一個函數內部,並且簽名像他提供的那樣,那麼它就不會編譯。 – pedromss

+0

當然,它確實...我會更新答案 – Dima

+0

請注意'='而不是'< - '它很微妙,他可能看不到它。同樣,如果在'yield'子句中使用'='可能也是 – pedromss