이 질문 에서 다음 코드 조각이 있습니다 .
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에는 귀여운 이름이 없지만 자세한 내용은 다음과 같습니다. 중요한 것은 Scala가 매개 변수를 반복 매개 변수로 메소드에 인수를 바인딩하는 방법을 변경한다는 것입니다.Node*
위에 것처럼).
_*
유형 약어는 SLS의 “4.6.2 반복 매개 변수”에서 설명합니다.
매개 변수 섹션의 마지막 값 매개 변수는 “*”로 접미사를 붙일 수 있습니다 (예 : (…, x : T *)). 방법 내에서 반복되는 파라미터의 타입은 시퀀스 타입 scala.Seq [T]이다. 반복되는 매개 변수 T *를 갖는 메소드는 T 유형의 가변 개수의 인수를 취합니다. 즉, (p1 : T1,.., pn : Tn, ps : S *) U 유형의 방법 m이 인수 (e1,…, ek)에 적용되는 경우 k> = n이면 m은 ps 이외의 모든 매개 변수 이름이 신선한 경우 k 유형의 k ¡ n 발생과 함께 (p1 : T1,.., pn : Tn, ps : S,.,, ps0S) U 유형을 갖도록 해당 애플리케이션에서 사용됩니다.이 규칙의 유일한 예외는 마지막 인수가 _ * 유형 주석을 통해 시퀀스 인수로 표시되는 경우입니다. 위의 m이 인수 (e1,…, en, e0 : _ *)에 적용되는 경우 해당 응용 프로그램의 m 유형은 (p1 : T1,.., pn : Tn, ps : scala .Seq [S])
답변
child ++ newChild
-순서:
-type ascription, 컴파일러가 이해하는 데 도움이되는 힌트, 해당 표현식의 유형_*
-모든 값 + vararg 연산자를 허용하는 자리 표시 자
child ++ newChild : _*
확장 Seq[Node]
합니다 Node*
(컴파일러가 시퀀스보다 varargs로 작업하고 있음을 알려줍니다). Varargs 만 허용 할 수있는 방법에 특히 유용합니다.
답변
위의 모든 대답은 훌륭해 보이지만 이것을 설명하기 위해 샘플이 필요합니다. 여기있어 :
val x : Seq[Seq[Int]] = Seq(Seq(1),Seq(2))
def f(arg: Seq[Any]*) : Int = {
arg.length
}
f(x) //1 as x is taken as single arg
f(x:_*) // 2 as x is "unpacked" as a Seq[Any]*
이제 우리 :_*
는 컴파일러에게 무엇을 해야 하는지를 안다 .이 인자를 풀고 x를 단일 인자로 사용하지 말고 함수 호출에서 vararg 매개 변수에 이들 요소를 바인딩하십시오.
간단히 말해 :_*
vararg 매개 변수에 인수를 전달할 때 모호성을 제거 하는 것 입니다.
답변
나와 같은 게으른 사람들에게는 Seq가 varArgs로 변환됩니다!
답변
