복붙노트

[SCALA] 한 인수 함수를 호출 할 때 왜 그리고 어떻게 스칼라 특별히 튜플을 치료한다?

SCALA

한 인수 함수를 호출 할 때 왜 그리고 어떻게 스칼라 특별히 튜플을 치료한다?

스칼라는 튜플에 여러 함수 호출 매개 변수를 합체 - 이것은 비활성화 할 수 있습니다? 스칼라 한 인수 함수에 바인딩 터플을 생성 논의한다. 이 결과

scala> println(1, 2)
(1,2)

대답은 컴파일러가 하나 개의 인수 기능이 더 괄호로 호출 할 수 있습니다, 그래서 논리적이 튜플로에 println의 호출이라고 말했다.

그러나에 println은 하나의 튜플 매개 변수를 호출 할 수 없습니다

scala> val t = (1, 2)
t: (Int, Int) = (1,2)

scala> println t
<console>:6: error: value t is not a member of Unit
       println t
           ^

그래서 뭔가 다른 일이 일어나고있다. 왜 튜플 여기에 특별하다?

해결법

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

    1.이 설명과는 달리, 스칼라에 println (1,2)를 구문 분석 (또는 그 문제에 관해서는 콘솔에 println (1,2))는 두 인수 메서드 호출을 구문 분석 같은 방법으로. 나중에, 컴파일러는 실제 방법 유형 서명과 일치하는 튜플의 메소드 인수를 포장하여 전화를 변환합니다.

    이 설명과는 달리, 스칼라에 println (1,2)를 구문 분석 (또는 그 문제에 관해서는 콘솔에 println (1,2))는 두 인수 메서드 호출을 구문 분석 같은 방법으로. 나중에, 컴파일러는 실제 방법 유형 서명과 일치하는 튜플의 메소드 인수를 포장하여 전화를 변환합니다.

    컴파일러는이 작업을 수행하지 않은 경우, 콘솔에 println (1,2)처럼 완벽하게 유효한 표현에 println 여러 인수를 사용하지 않기 때문에 컴파일에 실패합니다. 이 동작에 대한 다른 유효한 사용 사례도 있습니다.

    스칼라 당신이 드롭 할 수 있도록 특수 구문을 가지고 있음을 염두에두고,보기의 컴파일러의 관점에서 foo는 바 (1,2)와 같은 식을 생각해 보자. 메소드 호출에와 괄호. 이 인수 1과 2와 2 개의 인수를 줄 메소드를 호출 할 수도 있고, 그것은 하나의 튜플 값 인수 한 인수 바 메서드 호출 될 수 있습니다. 그냥 2 개의 인수를 메소드 호출로 구문 분석 있도록 파서는, 바 방법에 대해 아무것도 알지 못한다.

    유형 검사 단계에서, 컴파일러는 foo는 더 2 개의 인수를 줄 방법이없는 것으로 판단하지만, 누구의 서명 튜플 해석과 호환되는 하나의 인수를 줄 방법을 가지고 있다고 가정합니다. 다른 유효한 해석이 없기 때문에,이 당신이 무엇을 의미하고 튜플에 두 개의 인수를 변환하는 것으로 가정합니다. 두 인수 줄 방법, 실제 인수와 호환성이 하나라도있는 경우, 타이 퍼는 자동 tupling 변환을 수행하지 않습니다.

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

    2.성명, 기능이 항상 사실이 아니다에, 인수 호출 할 때 괄호를 생략 할 수있다. 그 참고 :

    성명, 기능이 항상 사실이 아니다에, 인수 호출 할 때 괄호를 생략 할 수있다. 그 참고 :

        println "hello"
        val puts = (s: String) => println(s)
        puts "hello"
    

    여기에는 튜플이 없다는 것을에도 불구하고, 하나가 작동하지 않습니다. 당신이 중위 표기법을 사용하는 경우 작동합니다. 다음 문은 잘 작동 :

        Console println "hello"
        val t = (1, 2)
        Console println t
        puts apply "hello" // puts is defined above
    
  3. from https://stackoverflow.com/questions/5997553/why-and-how-is-scala-treating-a-tuple-specially-when-calling-a-one-arg-function by cc-by-sa and MIT license