2010-07-14 6 views
3

나를 위해 스칼라 2.7.7.final 또는 2.8.0.final와를 컴파일되지 않습니다 :이 Scala 표현식에서이 nullary 함수에 대괄호가 필요한 이유는 무엇입니까?

new FileInputStream("test.txt") getChannel transferTo(
    0, Long.MaxValue, new FileOutputStream("test-copy.txt") getChannel) 

을 스칼라 2.7.7.final 및 2.8.0.final와을 컴파일 않습니다 나를 위해 :

new FileInputStream("test.txt") getChannel() transferTo(
    0, Long.MaxValue, new FileOutputStream("test-copy.txt") getChannel) 

왜 내가 대신 여기에 단지 getChannelgetChannel()을 할 필요가있다?

+0

getChannel은 메소드입니까? –

+1

Java FileIn/OutputStreams를 사용한다고 가정하면, 두 번째 예제도'transferTo '에 대한 인수가 잘못되어 여기 컴파일되지 않습니다. FileOutputStream의 chanel을 head 대신에'transferTo'의 인수 목록의 끝에 넣으려고했다는 뜻입니까? 그것은 여기서 컴파일됩니다. –

+0

Dan 감사합니다. 내 질문에 코드를 수정했습니다. 이것은 내 편집기의 코드 대 내 페이스트의 코드입니다. 나는 앞으로 게시 할 코드에 더주의 할 것입니다. –

답변

3

이유는 정말 간단합니다. . 당신이 대신 공백을 사용하는 경우 체인 방법의 다음 호출

귀하의 경우
a b c d  //is parsed as a call to 
(a.b(c))(d) 

마지막 두 개의 매개 변수가 같이 호출되고있다 (d이기 때문에 ef 말보다 하나 개의 매개 변수, d,보다) :

a b c(d, e, f) //is parsed as a call to 
a.b(c(d, e, f)) 

즉 첫 번째 경우와 동일합니다. 그러나 통화가 다음과 같아야합니다.

(a b).c(d, e, f) 

어느 쪽이 같지 않습니까?

  • a = new FileInputStream("test.txt")
  • b = getChannel
  • c = transferTo
  • d = new FileOutputStream("test-copy.txt") getChannel
  • e = 0
  • f = Long.MaxValue

이 2.7과 2.8 사이에서 변화되지 않은 같은 멀리 나는 알고있다!

+0

oxbox_lakes, 2.7/2.8 포인트가 정확합니다. 감사합니다. 나는 2.7.7.final과 2.8.0.final에서 두 경우를 재검사하고 그 행동이 동일하다는 것을 발견했다. 나는 그것을 반영하고 혼란을 제한하기 위해 나의 질문을 수정했다. –

+1

저는 해석이'a.b (c (d, e, f))'라고 확신합니다 - 연산자 적용 전에 객체 (매개 변수)에 대한 추론을'적용 '하십시오. –

+1

실수를 저지른 Apols Daniel - 해결됨 –

0

나는 토큰을 어떻게 나누는 지 컴파일러에게 명확하지 않기 때문에 믿습니다. new FileInputStream("test.txt")(getChannel, transferTo(...))이 맞나요? new (FileInputStream("test.txt"), getChannel, transferTo(...))? (new FileInputStream("test.txt")).getChannel(transferTo(...))? 컴파일러에서 transferTogetChannel에 의해 반환 된 개체의 속성임을 알 수있는 충분한 정보가 없습니다. 당신은 같은 거라고 최대 명확하게하기 위해

:

(new FileInputStream("test.txt")).getChannel().transferTo(
    (new FileOutputStream("test-copy.txt")).getChannel(), 0, Long.MaxValue) 
6

일반적인 규칙은 컴파일러, 즉

new FileInputStream("test.txt") // object 
getChannel       // method 
transferTo(...)     // parameter 

을 그래서 컴파일러는 transferTo을 호출하려고 의미

new FileInputStream("test.txt") getChannel transferTo(...) 

귀하의 경우 너무

object method parameter method parameter method parameter 

로 같은 문자열을 해석하는 것입니다 함수를 getChannel의 매개 변수로 전달할 수 있도록 무료 함수로 사용합니다.괄호를 추가하면 얻을 수 있습니다.

new FileInputStream("test.txt") getChannel() transferTo(...) 

new FileInputStream("test.txt") // object 
getChannel       // method 
()         // parameter (empty parameter list) 
transferTo       // method 
(...)        // parameter 
관련 문제