4

次のように、繰り返しパラメーター (varargs) 関数を scala で定義できることがわかっています。

def func(s: String*) = println(s)

私の質問は、上記を関数リテラルスタイルで書き直す方法です。それともそれは不可能ですか?

:(s: String) => println(s)は正しくありません。

4

2 に答える 2

9

次のように、scala でマルチパラメーター関数を定義できることがわかっています。

def func(s: String*) = println(s)

実際、それは関数ではなく、メソッドです。この 2 つは、Scala では根本的に異なります。

私の質問は、上記を関数リテラルスタイルで書き直す方法です。それともそれは不可能ですか?

:(s: String*) => println(s)は正しくありません。

関数リテラルで varargs 引数を定義することはできません。これに関するバグ報告が Scala バグ トラッカーにあり、Martin Odersky 自身によるコメントでは、基本的にこれは非常に複雑すぎると述べられています。

ただし、カンニングにはいくつかの方法があります。

関数の引数に型推論を使用する場合、つまり、引数が varargs 引数であることが静的に認識されているコンテキストで関数リテラルを使用する場合、すべて正常に機能します。

val func: (String*) => Unit = s => println(s)

または、メソッドを定義してから、η 拡張を介して部分的に適用された関数に変換することもできます。

def meth(s: String*) = println(s)

val func = meth _
于 2012-07-24T10:03:08.367 に答える
2

コメントに書かれているように。最初にメソッドを定義してから、メソッドを「指す」関数を使用することで、チートを行うことができます。

> def m(str:String*) = println(str)
m: (str: String*)Unit

> val f = m _
f: String* => Unit = <function1>

> f("1", "2")
WrappedArray(1, 2)
于 2012-07-24T09:49:09.040 に答える