web-dev-qa-db-ja.com

構文シュガー:Seqをメソッドパラメーターとして扱うための_ *

私はこの構造がウェブ上のどこかにあることに気づきました:

val list = List(someCollection: _*)

_*の意味?これはいくつかのメソッド呼び出しの構文糖ですか?この構文シュガーを利用できるように、カスタムクラスはどのような制約を満たす必要がありますか?

47
user7865221

一般に、:表記は型の割り当てに使用され、コンパイラーに値を特定の型として表示するように強制します。これは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 : _*)
70
Kevin Wright

これはscala配列を分解するための構文です。一部の関数は可変数の引数を取り、配列に渡すために配列引数に: _*を追加する必要があります。

17
davidk01

変数(数)の引数は*を使用して定義されます。例えば、

def wordcount(words: String*) = println(words.size)

wordcountはパラメータとして文字列を期待し、

scala> wordcount("I")
1

しかし、入力パラメーターとしてより多くの文字列を受け入れます(型の記述には_ *が必要です)

scala> val wordList = List("I", "love", "Scala")
scala> wordcount(wordList: _*)
3
1
GraceMeng