2013-08-20 5 views
6

나는 매개 변수로 가변 인자를 받아들이는 클래스를 작성하고, 사용자가 자주 매개 변수 지정하지 않고 인스턴스화 할 수 있도록 기본을 지정Scala varargs 매개 변수의 기본값을 지정할 수없는 이유는 무엇입니까?

class MyClass(values: Int* = 42) { } 

그러나, 컴파일러와 REPL이 나에게 다음과 같은 오류가 줄을 :

해결 방법으로
<console>:7: error: type mismatch; 
found : Int(42) 
required: Int* 
     class MyClass(values: Int* = 42) { } 
           ^
<console>:7: error: a parameter section with a `*'-parameter is not allowed to have default arguments 
     class MyClass(values: Int* = 42) { } 

, 나는 다음과 같은 시도했지만 그 중 하나가 작동하지 않았다 : (. 그것은 분명히 매우 모호한)

class MyClass(value: Int = 42, otherValues: Int*) { } 

varargs 매개 변수의 기본값을 가질 수없는 이유가 궁금합니다. 여기에있는 추론이나 기술적 인 이유는 무엇입니까? (내 생각 엔 비어있는 varargs를 지정하는 것은 특별한 구문이나 관용구가 필요하지만 충분한 이유인지 확실하지 않습니다.)

답변

5

이것에 대해 조금 생각, 나는 그것이 너무 많은 복잡성을 추가하지의 문제라고 생각합니다 당신이

def f(a: A, xs: X* = Seq(x0, x1)) = ??? 

이제 호출자가 같이 사용 있다고 가정 f(a)을.

발신자가 의 길이가 0 인 목록을 전달하려고했는지 또는 을 제공하지 않아 기본 인수를 트리거하려고했는지 어떻게 알 수 있습니까? 귀하의 예제에서 두 번째 대안은 앞으로있을 유일한 경우이고 컴파일러는 기본 인수 값을 제공해야한다고 가정합니다. 그러나 빈 Seq()은 이미 호출자가 제공 한 완벽하게 유효한 값입니다. 나는 발신자가 f(a, Seq(): _*)을 쓸 수 있다고 생각하지만 그것은 성가신 일이다.

+0

왜 'def foo (결과 : Int = 0, xs : String *) = ???'는 허용되지 않습니까? 컴파일러가 합법적 인 구조로'foo (0, "컴파일 할 수 없다")를 인식하는 것이 완벽하게 가능하다. –

+0

@ om-nom-nom, 내가 너를 잘 모르는.나는 def foo (결과 : int = 0, xs : String * = Seq ("some", "default")) = ???를 지원하지 않으려 고하는 이유에 대해 대답하고 있습니다. – huynhjl

+0

그래도 컴파일러는 내 경우에 똑같은 제한을 두었고 (최소한 동일한 컴파일 오류를 준다), 두 경우를 통합하는 다른 이유가있을 것이라고 생각한다. –

3

Varargs는 스칼라 에서뿐만 아니라 인수 목록을 추상화 한 것입니다 , 만약 내가 실수가 아니라면, 그것은 Seq, 인수 목록으로 desugared됩니다. 이것으로부터 파생되는 결과는 values: Int* = 42에서 어떤 결과를 기대합니까? 그런 다음이 메서드를 호출 할 때 인수가이 메서드에 전달되는 방법은 무엇입니까? 스칼라 사양 (4.6.2)에서

+2

하지만 값은 : int * = (Array (42) : Int *)' – Jatin

5

반복 매개 변수

와 매개 변수 섹션에있는 기본 인수는 어쩌면 해결 도움이 될 과학 네브라스카을 해제 할 수 없습니다

?

class MyClass(values: Int*) { 
    def this() = this(5) 
} 
+1

왜 그런지는 설명하지 않고 단지 그러한 거부를 가정합니다. –

2

또 다른 해결 방법은 서열 번호가 명시 적으로 만드는 것입니다 : 많은 인수가 전달되는 방법을 알아낼 수 없기 때문에

class MyClass(values: Seq[Int] = Seq(42)) { } 
+0

그래, 그게 내가 결국 해결 방법이야. – trustin

2

가변 인자에 대한 기본값은 그냥 이해가되지 않습니다. 이것은 스칼라의 제한 사항이 아니며 논리적 인 한계입니다.

관련 문제