1. ホーム
  2. スカラ

[解決済み】Scalaで`:_*`(コロン・アンダースコア・スター)は何をするのですか?

2022-04-09 08:29:43

質問

次のようなコードがあります。 この質問 :

def addChild(n: Node, newChild: Node) = n match {
  case Elem(prefix, label, attribs, scope, child @ _*) => Elem(prefix, label, attribs, scope, child ++ newChild : _*)
  case _ => error("Can only add children to elements!")
}

この作品以外は、すべてクリアしていますね。 child ++ newChild : _*

何をするものなのか?

があると理解しています。 Seq[Node] が連結され、さらに Node で、それで?はどうなるのでしょうか? : _* はどうするのですか?

どのように解決するのですか?

スプラッタが発生する。 1 を順番に表示します。

コンストラクタのシグネチャを見てみましょう。

new Elem(prefix: String, label: String, attributes: MetaData, scope: NamespaceBinding,
         child: Node*)

と呼ばれるもので

new Elem(prefix, label, attributes, scope,
         child1, child2, ... childN)

が、ここではシーケンスのみであり child1 , child2 というように、コンストラクタの入力として結果列を使用することができます。


1 これにはSLSのcute-nameがないのですが、詳細は以下の通りです。重要なのは、Scala が繰り返しパラメータを持つメソッドに引数をバインドする方法を変更するということです(これは Node* 上記)。

_* 型アノテーション は、SLS の "4.6.2 Repeated Parameters" でカバーされています。

<ブロッククオート

パラメータセクションの最後の値パラメータは,"*"で囲むことができる(..., x:T ). このようなメソッド内で繰り返されるパラメータの型は、次のようになります。 シーケンス型 scala.Seq[T] です。繰り返しパラメータT * を持つメソッドは 型の可変個数の引数T 。つまり、もしメソッド m が型 (p1 : T1, .... , pn : Tn,ps : S )Uがk >=nの引数(e1, ... , ek)に適用された場合 mは、その適用において、型(p1 : T1, ... , pn : Tn,ps : S, ... , ps0S)Uを持つとみなされます。 で、ps 以降のパラメータ名がすべて S 型であることが k ¡ n 回出現する。 が新鮮です。 このルールの唯一の例外は、最後の引数が以下のようにマークされている場合です。 を経由したシーケンス引数。 型アノテーションを使用します。上記のmを引数(e1, .... , en,e0 : _ に適用する。 ) である場合、そのアプリケーションにおける m の型は次のように解釈される。 (p1 : T1, ... , pn : Tn,ps :scala.Seq[S]) **.