문제

나는 C ++ 배경에서 나오는 Scala를 배우기 위해 노력하고 있습니다. 나는 스칼라를 코딩하는 방법을 배우는 데 도움이되는 작업 추적 앱을 위해 작은 수업을 작성하려고합니다.

이것은 마치 단순 해야하는 것처럼 보이지만 어떤 이유로 든 그것은 나를 피하고 있습니다.

package com.catenacci.tts

class Task(val ID:Int, val Description:String) {
 val EmptyID = 0
 val EmptyDescription = "No Description"

 def this() = this(EmptyID,EmptyDescription)
 def this(ID:Int)={
   this(ID,EmptyDescription)
 }
 def this(Description:String)={
   this(EmptyID,Description)
 }
}

작업 (ID, 설명), 작업 (ID), 작업 (설명)의 세 가지 생성자를 제공하려고합니다. 후자의 경우 값 중 하나를 발신자가 제공하지 않으면 값을 상수 값으로 초기화하려고합니다. 그리고 단위 테스트 목적으로 클래스 밖에서 이것을 확인할 수 있기를 원합니다. 그래서 나는 두 개의 공개 발을 넣는 것이 수업 밖에서 내 주가 내가 기대하는지 확인하기 위해 확인할 수 있다고 생각했습니다.

그러나 어떤 이유로이 코드는 컴파일되지 않습니다. 다음 오류가 발생합니다.

error: not found: value EmptyID

그리고

error: not found: value EmptyDescription

그래서 내가 무엇을 놓치고 있습니까? "Scala의 프로그래밍"을 통해 작업하고 있으므로이 질문에 대한 간단한 답변이 있으면 페이지 번호를 알려주십시오. 읽는 것이 마음에 들지 않지만 60 페이지와 62 페이지의 코드를 따라 가면이 코드가 왜 실패했는지 알 수 없습니다.

나는 이것이 생성자 방법이며 아마도 두 발의 생성자가 끝날 때까지 초기화되지 않았다는 사실과 관련이 있다고 생각합니다. 그것이 사실이라면 내가 찾고있는 효과를 얻을 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

동반자 객체에서 상수를 정의 할 수 있습니다.

object Task { 
 val EmptyID = 0
 val EmptyDescription = "No Description"
}

그런 다음 task.emptyid 및 task.memptydescription으로 참조하십시오.

Scala 2.8은 기본값을 지원한다고 생각합니다.

다른 팁

답은 Germán을 참조하십시오. 이것은 생성자가 있기 때문에 발생합니다 기술적으로 정적 범위의 일부. 다시 말해, 인스턴스가 아직 생성되지 않았기 때문에 생성자는 인스턴스 멤버에 액세스 할 수 없습니다. "클래스 멤버"는 실제로 인스턴스 멤버이므로 질문의 코드가 작동하지 않습니다. Germán의 답변은 두 개의 관련 값을 동반자 객체로 이동하여이를 해결하여 효과적으로 정적으로 구성합니다. Task 클래스 (실제로는 아니지만 그렇게 생각할 수 있습니다).

"Scala의 프로그래밍"에서 생성자 호출의 체인이 설명되는 6.7 절을 참조하십시오. 1 차 생성자는 "클래스의 단일 입력 지점"으로 설명됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top