스칼라에서 param : _ *는 무엇을 의미합니까?
Scala (2.9.1)를 처음 접했기 때문에 a가 List[Event]
있고이를으로 복사하고 Queue[Event]
싶지만 다음 구문은 Queue[List[Event]]
대신 a 를 생성합니다 .
val eventQueue = Queue(events)
어떤 이유로 다음이 작동합니다.
val eventQueue = Queue(events : _*)
그러나 그것이 무엇을하고 왜 작동하는지 이해하고 싶습니다. 이미 Queue.apply
함수 의 시그니처를 살펴 보았습니다 .
def apply[A](elems: A*)
그리고 첫 번째 시도가 작동하지 않는 이유를 이해하지만 두 번째 시도의 의미는 무엇입니까? 무엇 :
, 그리고 _*
이 경우, 그리고 왜하지 않는 apply
기능은 단지을 Iterable[A]
?
a: A
유형 지정입니다. Scala에서 유형 지정의 목적 은 무엇입니까?를 참조하십시오 .
: _*
컴파일러에게 시퀀스 유형의 단일 인수를 가변 인수 시퀀스, 즉 varargs로 처리하도록 지시하는 특수한 유형 지정 인스턴스입니다.
시퀀스 또는 반복 가능한 단일 요소 를 사용하는 Queue
using 을 만드는 것은 완전히 유효 Queue.apply
하므로 단일 Iterable[A]
.
이것은 컴파일러에게 모든 요소를 단일 인수로 전달하는 것이 아니라 자체 인수로 전달하도록 컴파일러에 지시하는 특수 표기법입니다. 를 참조하십시오 여기 .
시퀀스 인수 를 나타내는 유형 주석이며 언어 사양의 섹션 4.6.2, "반복 매개 변수"의 일반 규칙에 대한 "예외"로 언급됩니다.
함수가 , 등 def sum(args: Int*)
으로 호출 될 수 있는 함수와 같은 가변 개수의 인수를 취할 때 유용 합니다.와 같은 목록이있는 경우 , 대신 ,이기 때문에 자신을 전달할 수 없습니다 . 하지만 .sum(1)
sum(1,2)
xs = List(1,2,3)
xs
List
Int
sum(xs: _*)
Python 사용자 :
Scala의 _*
연산자는 Python의 * -operator 와 거의 동일 합니다 .
예
Luigi Plinge에서 제공 한 링크 에서 scala 예제를 변환합니다 .
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
파이썬은 다음과 같습니다.
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
둘 다 다음과 같은 출력을 제공합니다.
무엇
최대
문서는?
차이점 : 위치 매개 변수 압축 풀기
파이썬의 *
-operator는 또한 고정 인자 함수에 대한 위치 매개 변수 / 매개 변수의 압축을 풀 수 있습니다.
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
Scala에서도 동일하게 수행합니다.
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
실패합니다 :
메서드 곱하기에 대한 인수가 충분하지 않습니다 : (x : Int, y : Int) Int.
지정되지 않은 값 매개 변수 y.
그러나 스칼라를 사용하여 동일한 결과를 얻을 수 있습니다.
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
Lorrin Nelson 에 따르면 이것이 작동하는 방식입니다.
첫 번째 부분 인 f _는 인수가 지정되지 않은 부분적으로 적용된 함수의 구문입니다. 이것은 함수 객체를 확보하는 메커니즘으로 작동합니다. tupled는 단일 arity-n 튜플을 취하는 arity-1의 새로운 함수를 반환합니다.
추가 읽기 :
참고 URL : https://stackoverflow.com/questions/7938585/what-does-param-mean-in-scala
'Development Tip' 카테고리의 다른 글
AngularJS 1.x에서 필터를 단위 테스트하는 방법 (0) | 2020.11.07 |
---|---|
Python의 표준 라이브러리에 정렬 된 컨테이너가없는 이유는 무엇입니까? (0) | 2020.11.07 |
ON DUPLICATE KEY를 사용하여 삽입하려는 모든 것을 업데이트하는 방법이 있습니까? (0) | 2020.11.07 |
SQL 쿼리 결과가 임시 테이블에 삽입되는 방법은 무엇입니까? (0) | 2020.11.07 |
툴바 탐색 햄버거 아이콘 누락 (0) | 2020.11.07 |