2016-05-11 14 views
4

複数のパラメータリストおよびデフォルト引数

class Test { 

    def f(arg: Int)(defaultArg: String => Unit = println): Unit = ??? 

    f(42) 
} 

missing argument list for method f in class Test [error] Unapplied methods are only converted to functions when a function type is expected. [error] You can make this conversion explicit by writing `f _` or `f(_)(_)` instead of `f`. [error] f(42) [error] ^ [error] one error found

なぜそれができないので失敗?あいまいさが導入されますか?それは単一のパラメータリストに頼らないで動作させることは可能ですか?

答えて

8

あなたのケースのための正しい構文は以下の通りです:

f(42)() 

あなたは暗黙のようdefaultArgを定義することによって、Fへのコール(42)の作業を行うことができます。

def f(arg: Int)(implicit defaultArg: String => Unit = println): Unit = ??? 

次に、あなたがそれを呼び出すことができます。

f(42) 
+0

ああ、あなたは(指定する必要があります)パラメータのリストについては、* *それは暗黙のパラメータリストでない限り、 –

0

したがって、Int引数を、次のようなメソッドと関数に渡すことができます。それを印刷する。今度はf(42)と言うとき、コンパイラはその関数がIntに適用され、別の関数が得られることを知ります。これは部分的に適用された関数のケースであることがわかります。 したがって、f(42)という呼び出しを行うと結果は別の関数になります。コンパイラは、2番目の引数を渡すか、またはこの結果を部分的に適用された関数として処理する必要があると言っています。

あなたはそれが理にかなっているので、私は明示的なタイプを書かれている見ることができるように、

val ptln1:String=>Unit = System.out.println _ //Doing this to show the type of the println function 
def f(arg: Int)(defaultArg: String => Unit = ptln1): Unit = ??? 
val t = f(42)() 

を次のコードを考えてみましょう。
だから今、あなたは私が代わりにprintlnの自己定義関数を使用する場合

def f(arg: Int)(defaultArg: String => Unit = println _): Unit = ??? 
    val t = f(42)() 

はまた、必要に応じて以下の点を考慮して、以下のような暗黙のない

def f(arg: Int)(implicit defaultArg: String => Unit = println _): Unit = ??? 
f(42)() 

それともこれを暗黙を使用して関数を渡すことができますいずれか。多分、これはそれをより明確にするでしょう。

implicit def testPrint(str:String):Unit = ??? 

    def f(arg: Int)(implicit defaultArg: String => Unit = testPrint): Unit = ??? 

    val t = f(42) 

あるいは暗黙のない、

def testPrint(str:String):Unit = ??? 

    def f(arg: Int)(defaultArg: String => Unit = testPrint): Unit = ??? 

    val t = f(42)() 
関連する問題