2012-03-19 2 views
4

가능한 중복 :
What is the rule for parenthesis in Scala method invocation?괄호는 메서드에서 언제 필요합니까 (또는 금지됩니까?

나는 스칼라에 새로 온 사람, 나는 몇 가지 혼란이 후위 연산자에()

내가 toLong 및 toString 들었다

모든 정수에 대한 접미사 연산자이므로 다음 작업을 시도했습니다.

scala> 7 toString 
res18: java.lang.String = 7 

scala> 7.toString() 
res19: java.lang.String = 7 

scala> 7.toString 
res20: java.lang.String = 7 

scala> 7.toLong 
res21: Long = 7 

scala> 7.toLong() 
<console>:8: error: Long does not take parameters 
       7.toLong() 
        ^

그럼 언제 연산자 뒤에 "()"를 사용해야하나요? 거기에 어떤 패턴이 있습니까?

큰 감사!

답변

12

첫째, 그것은 것으로 toLongtoString 생각하는 아마 더 나은 방법 후위 연산자보다 Int 클래스. 정수 리터럴은 스칼라의 객체이므로 두 메서드가 toLongtoString입니다. (암시 적 변환 등으로 인해 상황은 Int과 다소 복잡합니다. 그러나 초보자로 생각하는 것이 좋습니다.)

괄호를 삭제하는 규칙은 무엇입니까? 메서드가 아무런 인수도 취하지 않으면 Scala 구문을 사용하여 ()을 삭제할 수 있습니다. 방법은 괄호없이 정의 된 경우, 그들은 전혀 허용되지 않습니다

마지막으로
class A() { 
    def stuff() = "stuff" 
    def things = "things" 
} 

val a = new A() 

a.stuff  // fine 
a.stuff() // fine 
a.things // fine 
a.things() // error! 

, 괄호를 드롭 할 때 당신이 그들을 계속 않을 때? 관습 적으로 스칼라에서는 부작용이없는 메서드에 대해서는 괄호를 사용하지 않으며 부작용이있을 때는 그대로 유지합니다. 분명히 이것은 스타일 일 뿐이지 만 코드가 작동하는 방식에 대해 독자들에게 추가적인 단서를 제공합니다.

+0

그래서 Int 클래스는 괄호없이 toLong 메서드를 정의하기 때문에 오류가 발생 했습니까? –

+0

나는 그것을 얻었다! Dhg 감사합니다! –

+0

@ dhg : 그런 부작용의 예를 들려 주시겠습니까? 모든 뮤 테이터 메서드는 부작용이 있으며 접근자가 부작용을 가질 수는 없다고 생각합니다. 내 이해가 정확합니까? – SlowAndSteady

5

자세한 내용은 What is the rule for parenthesis in Scala method invocation?을 참조하십시오.

또한 Int.toLong은 괄호없이 정의되므로 괄호로 호출 할 수 없습니다. 부작용이 없기 때문에 괄호없이 정의되는 경우가 많습니다 (규칙).

toString()은 Java에서 제공되므로 상호 운용성을 위해 괄호로 정의되었으므로 괄호 사용 또는 사용 안 함으로 호출 할 수 있습니다.

+0

알겠습니다. 고맙습니다! –

+2

방금'(123.toString() (1)'은''2 ''이지만'(123.toString) (1)''은''1 ' 'toString()'메소드로 옮긴다. 예상치 못한 일. –

+0

@Luigi는 파서가'(123)'에'toString'을 호출하기 전에'toString'에'(1)'을 붙여야한다는 시나리오를 상상할 수 없기 때문에 저에게 버그처럼 보입니다. – dhg

관련 문제