私はこの構造がウェブ上のどこかにあることに気づきました:
val list = List(someCollection: _*)
_*
の意味?これはいくつかのメソッド呼び出しの構文糖ですか?この構文シュガーを利用できるように、カスタムクラスはどのような制約を満たす必要がありますか?
一般に、:
表記は型の割り当てに使用され、コンパイラーに値を特定の型として表示するように強制します。これはquiteではなく、キャストと同じです。
val b = 1 : Byte
val f = 1 : Float
val d = 1 : Double
この場合、特別なvarargsタイプを使用しています。これは、varargsパラメーターの宣言に使用されるアスタリスク表記を反映しており、Seq[T]
をサブクラス化する任意のタイプの変数で使用できます。
def f(args: String*) = ... //varargs parameter, use as an Array[String]
val list = List("a", "b", "c")
f(list : _*)
これはscala配列を分解するための構文です。一部の関数は可変数の引数を取り、配列に渡すために配列引数に: _*
を追加する必要があります。
変数(数)の引数は*を使用して定義されます。例えば、
def wordcount(words: String*) = println(words.size)
wordcountはパラメータとして文字列を期待し、
scala> wordcount("I")
1
しかし、入力パラメーターとしてより多くの文字列を受け入れます(型の記述には_ *が必要です)
scala> val wordList = List("I", "love", "Scala")
scala> wordcount(wordList: _*)
3