2017-09-03 4 views
1

内部スカラ関数Iは、次のコードを持っている:コール可変

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 1の内部に格納された関数を呼び出すことです。しかし、私は "変数fの中に格納された関数を呼び出す"ために何を置くのか分かりません。

私は入れてみました:

result = f() 

しかし、私のIDEは、コンパイルエラーになります。

ありがとうございました。

答えて

0

funcs変数は、実際にはfunc1,func2およびfunc3を呼び出した結果のリストです。これらは関数定義です。

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)は、(この場合はStringfooを呼び出した結果)のリストを作成し、 fooは括弧なしで宣言されているため)、List(foo _)は関数リストで、Stringを返します。 だから、あなたが書いたとおり、fStringなので、f()は意味がありません。 一方私のスニペットでは、fが関数で、f()がそれを呼び出すでしょう。

+0

for the comprehensionが、彼が提供したような署名を持つ関数の内部にある場合、コンパイルされません。 – pedromss

+0

確かにそれは...私は答えを更新します – Dima

+0

'<'に注意を喚起してください。微妙なものではないかもしれません。また、 '='を使用して 'yield'節にあるかもしれない場合は、 – pedromss

関連する問題