2011-03-04 10 views
0
class X extends Map[String, String] { 
    def x(): X = { X() } // can't be compiled 
} 

컴파일 할 수없는 오류는 다음과 같습니다왜이 간단한 스칼라 예제를 컴파일 할 수 없습니까?

<console>:6: error: not found: value X 
def x(): X = { X() } // can't be compiled 

왜 X가 를 찾을 수 없습니다 ? 나는 그것을 고칠 수있는 방법을 볼 수 없습니다.


UPDATE :

는 지금 이유를 알고있다. 내가하려는 것은 HashMap을 확장하는 클래스를 만드는 것입니다. Map()HashMap의 인스턴스를 반환 할 것이기 때문에 Map을 확장 할 수 있다고 생각합니다. 이제 올바른 코드가 있어야한다 :

import scala.collection.immutable.HashMap 
class X extends HashMap[String, String] { 
    def x(): X = { new X() } 
} 
+0

으로 이전했습니다. Kevin Wright님께서는 아주 좋은 답장을 보내 주셨습니다. 스칼라 2.8 콜렉션을 확장/생성하는 것만으로 초점을 맞추는 또 다른 의문점을 만드는 것을 고려해보십시오. 특히 "un-bury"문제가 있습니다. –

+0

@pst, 좋은 제안이지만, 지금은 스칼라에 너무 익숙하지 않습니다. 나는 그 질문을하는 법을 모릅니다. – Freewind

답변

4

new X() 대신 X() 시도 - 다른 오류가 발생합니다,하지만 내가 믿는 바른 길에 당신을 설정합니다. 이 X 가리키는 에 적용 호출하려고 후자의 경우

(예 Xobject X 또는 val X 같이 정의된다 상상)과 클래스 X. 생성자의 호출하지

해피 코딩.

+0

감사합니다. 어떻게 올바르게 할 수 있는지 말해 줄 수 있습니까? 나는 스칼라를 처음 접했고 지금은 많이 시도해 왔습니다. – Freewind

1

당신이 무엇을 하려는지 명확하지 않지만 컴파일되지 않는 이유는 'X'라는 필드, 함수 또는 메소드가없고 'apply (') '가있는'X '모듈이 없다는 것입니다.) '방법.

"어떻게 수정합니까?"

달성하려는 목표를 명확히하십시오.

+0

OK, 질문을 업데이트했습니다. 감사합니다. – Freewind

13

다른 방법을 시도해 볼 것을 권장 할 수 있습니까?

컬렉션 라이브러리를 확장하면 스칼라에서 할 수있는 고급 기능 중 하나입니다. 일을 제대로하려면 더 높은 유형의 유추, 추론, 분산, 암시 및 CanBuildFrom 메커니즘에 대한 깊은 이해가 필요합니다. 이것은 초보자가 할 수있는 가벼운 마음가짐이 아닙니다.

반면에 실제로 컬렉션을 확장해야한다는 것은 매우 드뭅니다.

첫 번째 원칙으로 돌아 가기 올바른 해결 방법은 HashMap을 확장하는 것이라고 생각하는 문제는 무엇입니까? 스칼라에서 할 수있는 더 나은 방법이 있다는 것을 사실상 보장 할 수 있습니다.

UPDATE Mk.II를

이 대답은 이전 컬렉션 프레임 워크 CanBuildFrom 논리에 대한 설명이 포함되어 있습니다. @ soc 님의 제안에 따라 답변의 해당 부분을 FAQ question here

+0

친절한 조언을 부탁드립니다. 다른 클래스와 함께 작동하도록 HashMap을 확장 한 클래스를 사용하는 것이 어렵다는 것을 알았습니다. 그래서 포기했습니다. 나는 너무 초보자 다. 나는 그것에 관해 당신에게 더 많이 물을 수 없다. 스칼라를 배우는 데 더 많은 시간을 할애 해주세요. 다시 한번 감사드립니다. – Freewind

+0

아주 좋습니다. 이것을 'FAQ 질문'으로 게시하는 것을 고려하십시오 -이 게시물에 묻혀 있습니다. –

+2

@soc - 더 나은 여전히 ​​스택 오버플로에 대한 모든 대답을 수집하여 책에 넣을 것입니다. –

관련 문제