2014-09-28 7 views
1

아래 코드는 실제 목록을 만들려면 목록 유형과 빈 목록과 단점을 나타내는 경우 클래스 하나 두 구현을 정의스칼라 : 사례 클래스 인스턴스를 만들려면 컴패니언의 "적용"메소드가 필요합니까?

sealed trait List[+A] 
case object Nil extends List[Nothing] 
case class Cons[+A](head: A, tail: List[A]) extends List[A] 

object List { 
    ... 
    def apply[A](as: A*): List[A] = { 
    if (as.isEmpty) Nil 
    else Cons(as.head, apply(as.tail: _*)) 
    } 
    val example = Cons(1, Cons(2, Cons(3, Nil))) 
} 

목록이 순환하여 만든 나의 가정 정확한지는 때 val example = ...를 위의 방법을 적용 실행됩니다.

는 이렇게됩니다. 단점을 만들기위한 서명 스칼라가 실제로

class Foo(s: String, i: Int) 

스칼라에서, 그것은 클래스를 생성 말할 때 List(1, 2, 3, Nil)

답변

1

될하기 위해 val example을 유추 않는 방법, 적용의 서명이 호환되지 않는 variaddef apply[A](as: A*): List[A] 그대로 Cons(head, tail)입니다 Foo이고 생성자는 StringInt입니다.

그것은 자바 클래스의 경우 클래스와

public class Foo { 
    public Foo(String s, int i) { 
     ... 
    } 
} 

로 선언 거의 동일합니다, 컴파일러는 생성자와 같은 매개 변수를 복용 기본 apply 방법 동반자 개체로 추가-케이크를 제공합니다. 직접 Cons(head, tail)를 호출 할 수 있습니다 이유를 명시 적으로 생성자를 정의하지 않고

그래서 즉,이다.

+0

대해'발 예 2 = 목록 (1,2,3)', 내가 만드는 데 함께 머리와 꼬리를 넣어 말 생성자가 없기 때문에 실제로 나는 단점 인스턴스가 생성되는 방법을 이해하기 위해 노력하고있어 단점 [Int], 스칼라는 어떻게 이것을 성취합니까? –

+0

나는 그 질문을 이해할 수 있을지 확신하지 못한다. 'Const'는 사례 클래스이므로, A와 List [A]를 취하는 생성자를 가지고 있습니다. 당신은 명시 적으로'apply' 메쏘드의 else 브랜치에서 그것을 호출합니다. –

+0

당신이 나의 초심자를 용서 할 수 있다면 나는 설명하려고 노력할 것이다. Cons가 언급했듯이, Cons에는 아무 것도 없기 때문에 빈 생성자가 있습니다. Apply는 인스턴스를 생성하기 위해 Cons를 재귀 적으로 호출합니다. 그러나 apply와 cons 생성자의 매개 변수는 다릅니다. –