2010-07-28 4 views
10

이 코드의 기능은 무엇입니까? 왜 두 세트의 생성자 매개 변수가 있습니까?스칼라 클래스의 두 집합의 생성자 매개 변수

class A(val x: Int)(val y: Int) 

나는 객체를 초기화하고 두 필드를 사용할 수 있습니다

val a = new A(5)(7) 
println(a.x + ", " + a.y) 

내가 경우 클래스를 만들 경우, 나는 단지 매개 변수의 첫 번째 세트에 의해 일치시킬 수 있습니다.

case class A(x: Int)(y: Int) 
val a = A(5)(7) 
a match { 
    A(x) => println(x) 
} 

3 세트의 매개 변수를 만들 수 없습니다. 컴파일되지 않습니다. 그렇다면 생성자 매개 변수의 두 세트의 의미는 무엇입니까?

+1

내가 만든 것이 아닙니다. 스칼라 스윙 라이브러리에서이 구조를 발견했습니다 : https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/event/MouseEvent.scala – PeWu

답변

7

scala specification (5.3 절 참조)에 따르면, 두 번째 매개 변수 집합은 암시 적 매개 변수 전용입니다. 매개 변수를 두 세트로 나누면 비 암시 적 매개 변수 만 정의하고 다른 매개 변수는 문맥 상 정의 할 수 있습니다.

실제로 컴파일러가 두 번째 집합에서 비 암시 적 매개 변수를 accpet한다는 것은 이상합니다.

+2

고마워요. 두 번째 집합에 _implicit_ 키워드를 추가하면 암시 적으로 시작되지만 _implicit_ 키워드가 없으면 암시 적으로 암시 적이 지 않습니다. 어쨌든 스칼라 사양에서는 두 번째 집합의 암시 적 매개 변수를 허용하지 않습니다. – PeWu

+0

음 ... 스펙의이 섹션은 매우 이상하게 보입니다. 문법 바로 아래에있는 예제는 문법과 일치하지 않는 것 같습니다. 그리고 "class Test (a : Int) (b : Int) (c : Int)"는 유효한 클래스 정의입니다. – Nicolas

+1

@PeWu +1 "암시 적 키워드없이 내재적으로 암시 적이 지 않습니다"라는 문구가 있음 – I82Much

관련 문제