`: _ *`(콜론 밑줄 별)은 스칼라에서 무엇을합니까?


195

이 질문 에서 다음 코드 조각이 있습니다 .

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것과 연결되어 있다는 것을 알고 있습니까? 무엇을 : _*합니까?


70
제목에 (콜론 밑줄 별)을 추가해 주셔서 감사합니다!
Gal

답변:


151

그것은 "표시" 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])


5
실제로는 연산자가 아니지만 "Smooch 연산자"라고 부릅니다.
Henrik Gustafsson

1
파이썬에서는 이것을 언 패킹이라고합니다
joshlk

Java varargs와 같이 시퀀스의 길이에 제한이 있습니까?
qwwqwwq

95
  • child ++ newChild -순서
  • : -type ascription, 컴파일러가 이해하는 데 도움이되는 힌트, 해당 표현식의 유형
  • _* -모든 값 + vararg 연산자를 허용하는 자리 표시 자

child ++ newChild : _*확장 Seq[Node]합니다 Node*(컴파일러가 시퀀스보다 varargs로 작업하고 있음을 알려줍니다). Varargs 만 허용 할 수있는 방법에 특히 유용합니다.


1
"type ascription"에 대해 더 쓸 수 있습니까? 그것은 무엇이며 어떻게 작동합니까?
amorfis


24

위의 모든 대답은 훌륭해 보이지만 이것을 설명하기 위해 샘플이 필요합니다. 여기있어 :

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 매개 변수에 인수를 전달할 때 모호성을 제거 하는 것 입니다.


5

나와 같은 게으른 사람들에게는 Seq가 varArgs로 변환됩니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.