1

重複の可能性:
Scalaの可変長引数リストのタイプは何ですか?

私は最近、パラメータリストでこの投稿に出くわしました:https ://stackoverflow.com/a/4684598/1287554そして私はそれが本当に面白いと思います。

また、以下のユースケースも理解しています。

def fn(x:Int*) = x.sum                    //> fn: (x: Int*)Int  
fn(1,2,3)                                 //> res0: Int = 6

私が見る明らかな説明は、それが次のコードのある種の構文糖衣であるということです。

def fn(x:List[Int]) = x.sum               //> fn: (x: List[Int])Int
fn(List(1,2,3))                           //> res0: Int = 6

しかし、私はそれらについてのドキュメントを見つけることができません。このタイプの関数パラメーターについて説明しているリンクを誰かに教えてもらえますか?また、それらはパラメータリストまたは他の何かと呼ばれていますか?何も見つからないのは、間違った名前で検索しているからかもしれません。

4

2 に答える 2

6

これらは可変長引数リスト(Randallが彼の回答で正しく指摘したように、仕様に従って繰り返されるパラメーター)であり、通常は「varargs」として知られ、そのような機能を実装したK&RCライブラリ関数の名前です。

Scalaの場合、JVMレベルでは、arg: T*パラメーターはarg: Seq[T]、通常はを介して、として渡されますWrappedArray

構文と同じものを持つJavaはT... arg、常にパラメータをとして渡しますArray[T]。ScalaはJavavarargsを認識し、Scalaと同様にそれらを呼び出すことができます。

ScalavarargsとJavavarargsの重要な違いの1つは、パラメーターではなく、パラメーターを含むオブジェクトを渡して、それらを実装するメソッドを呼び出すために使用される規則です。Javaでは、配列を渡すだけです。

public void m(String... args)

String[] list = new String[] { "a", "b", "c" };
m(list)

一方、Scalaでは、意味を明確にするために特別な構文に頼る必要があります。

val list = Seq("a", "b", "c")
m(list: _*)

また、パターンマッチングの際には、逆の演算子があります。

list match {
    case Seq(xs @ _*) => xs.size
    case _            => 0
}
于 2013-01-15T14:30:55.403 に答える
3

まず、Scala はそれらを「可変引数」ではなく「反復パラメーター」と呼んでいます。

繰り返される仮パラメータに対応する実パラメータは、特別な種類の によってIndexedSeq実装されWrappedArrayます:

scala> def mRP1(ints: Int*): Int = { printf("ints=%s%n", ints); ints.length }
mRP1: (ints: Int*)Int

scala> mRP1(1, 4, 9)
ints=WrappedArray(1, 4, 9)
res0: Int = 3

これらは によって実装されているため、IndexedSeq一定時間のインデックス アクセスがあることに注意してください。

于 2013-01-15T15:04:52.243 に答える