복붙노트

[SCALA] _ * 스칼라의 의미 : 무슨 일이 PARAM은 무엇입니까?

SCALA

_ * 스칼라의 의미 : 무슨 일이 PARAM은 무엇입니까?

스칼라 (2.9.1)에 새로운이기 때문에, 나는 목록 [이벤트]이 있고 큐 [이벤트]에 복사하고 싶지만, 다음과 같은 구문 대신 큐 [목록 [이벤트] 산출 :

val eventQueue = Queue(events)

어떤 이유로 들어, 작품을 다음과 같은 :

val eventQueue = Queue(events : _*)

그러나 나는 그것이 무엇을 이해하고자하는, 그리고 왜 작동? 난 이미 Queue.apply 함수의 서명을 보았다 :

def apply[A](elems: A*)

그리고 첫 번째 시도가 작동하지 않는 이유는 이해하지만 두 번째의 의미는 무엇인가? 무엇이다, 및 _ *이 경우, 왜 함수가 단지의 Iterable [A]을 적용하지 않는 이유는 무엇입니까?

해결법

  1. ==============================

    1.A :이 유형의 귀속입니다; 스칼라 형 ascriptions의 목적은 무엇인가?를 참조하십시오

    A :이 유형의 귀속입니다; 스칼라 형 ascriptions의 목적은 무엇인가?를 참조하십시오

    : _ * 즉 가변 인자 가변 인수 시퀀스와 같은 순서 형의 인수를 취급하도록 컴파일러에 지시 타입 귀속의 특별한 경우이다.

    시퀀스 또는 반복 가능한 단일 요소가 큐 사용 Queue.apply을 만들 완전히 유효합니다, 그래서 이것은 당신이 [A] 하나의 Iterable을 줄 때 일어나는 정확히 것입니다.

  2. ==============================

    2.이것은 오히려 하나의 인수로 그 모든 것보다, 자신의 인수로 각 요소를 전달하는 컴파일러를 알려주는 특별한 표기법입니다. 여기를 봐.

    이것은 오히려 하나의 인수로 그 모든 것보다, 자신의 인수로 각 요소를 전달하는 컴파일러를 알려주는 특별한 표기법입니다. 여기를 봐.

    그것은 일련의 인수를 표시하고 언어 사양 "반복 매개 변수"절 4.6.2의 일반 규칙에 "예외"로 언급되는 유형 약어입니다.

    함수가 가변 인자를받는 때 예컨대 유용 이러한 방어 합으로서의 기능 : 당신은 XS 같은 목록이있는 경우 (인수가 지능 *) 등의 합 (1), 합 (1,2)으로 호출 할 수있는 목록 = (1,2,3)을 그것은 오히려 지능보다 목록을하기 때문에, XS 자체를 통과 할 수는 없지만 합 사용하여 요소를 전달할 수 있습니다 (XS를 : _ *).

  3. ==============================

    3.파이썬 사람들을 위해 :

    파이썬 사람들을 위해 :

    스칼라 _ * 연산자 파이썬 *의 -operator 개 이하 동일하다.

    루이지 Plinge에서 제공하는 링크에서 스칼라 예를 변환 :

    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)
    

    모두 다음과 같은 출력을 제공합니다 :

    차이 : 위치 매개 변수를 풀고

    파이썬의 *의 - 연산자는 고정 인수에 대응 기능을위한 위치 매개 변수 / 매개 변수의 개봉을 처리 할 수 ​​있지만 :

    def multiply (x, y):
        return x * y
    
    operands = (2, 4)
    multiply(*operands)
    

    스칼라와 같은 일을 :

    def multiply(x:Int, y:Int) = {
        x * y;
    }
    
    val operands = (2, 4)
    multiply (operands : _*)
    

    실패합니다 :

    하지만 스칼라와 같은을 달성 할 수 있습니다 :

    def multiply(x:Int, y:Int) = {
        x*y;
    }
    
    val operands = (2, 4)
    multiply _ tupled operands
    

    Lorrin 넬슨에 따르면이 작동하는 방법이다 :

    추가 읽기 :

  4. from https://stackoverflow.com/questions/7938585/what-does-param-mean-in-scala by cc-by-sa and MIT license