스칼라 열거 이해


122

나는 Scala 열거 형 클래스를 이해하지 못한다고 말해야한다. 문서에서 예제를 복사하여 붙여 넣을 수는 있지만 무슨 일이 일어나고 있는지 전혀 모릅니다.

object WeekDay extends Enumeration {
  type WeekDay = Value
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
  • 무슨 뜻 type WeekDay = Value이고 왜 써야하나요?
  • val Mon = Value? 그게 무슨 뜻이야?
  • WeekDay 개체 를 가져와야하는 이유는 무엇 입니까? 과,
  • 내가 쓸 때 val day = WeekDay.Mon왜 유형 WeekDay.Value이 아닌 유형 WeekDay입니까?

2
pedrorijo.com/blog/scala-enums/ : 나는 당신이 그것을 유용하게 사용할 수있는 스칼라 열거 및 대안에 대한 작은 개요를 작성했습니다
pedrorijo91

답변:


150

Enumeration특성은 유형의 멤버가 Value열거의 개별 요소를 (실제로 내부 클래스,하지만 차이는 여기에 중요하지 않습니다) 대표를.

따라서 object WeekDay해당 유형 멤버를 상속합니다. 라인 type WeekDay = Value은 단지 유형 별칭 입니다. import WeekDay._를 사용 하여 다른 곳에서 가져온 후 해당 유형을 사용할 수 있기 때문에 유용 합니다. 예 :

def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)

대신 최소 버전은 다음과 같습니다.

object WeekDay extends Enumeration {
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}

당신은하지 않습니다 의 내용을 가져올 수 object WeekDay있지만, 당신은 유형을 사용해야합니다 WeekDay.Value및 개인 회원을 한정. 따라서 예는

def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)

두 번째 질문은의 의미에 관한 것입니다 val Mon, ... = Value. 의 구현을 살펴 보지 않으면 실제로 매우 혼란 스럽습니다 Enumeration. 이것은 유형의 할당이 아닙니다! 대신 보호 호출하는 같은 이름의 방법 , Value유형의 구체적인 인스턴스를 반환합니다 Value.

그래서 당신이 쓸 수 발생 val a, b, c = foo스칼라에서, 각각의 값에 대해 a, b그리고 c방법은 foo또 다시 호출됩니다. Enumeration이 트릭을 사용하여 내부 카운터를 증가시켜 각 값이 개별적이되도록합니다.

에 대한 Scala API 문서를 열고를 Enumeration클릭 Visibility: All하면 해당 메서드가 나타나는 것을 볼 수 있습니다.


2
감사합니다. 매우 혼란 스럽지만 옳다고 생각합니다. 대신 봉인 된 케이스 클래스를 사용하겠습니다. 100 % 더 쉬워 보입니다.
Karel Bílek 2012-06-16

2
개인적으로 봉인 된 케이스 클래스도 선호합니다. 좀 더 장황하지만 변경 가능한 내부 카운터 등이있는 호쿠 스포 쿠는 적습니다. Scala 2.10에는 열거 형 (Java와 달리 언어 구조가 아니라 라이브러리 솔루션)을 매크로를 사용하여 더 잘 작성할 수있는 방법이 있습니다.
0__

@ 0__ Scala에서 enum을 대체하기 위해 봉인 된 클래스를 사용하는 이유와 방법을 물어봐도 될까요? Scala의 열거에 문제가 있습니까?
x1a0 2013 년

Enum 값 자체에 멤버가 있으면 어떻게됩니까? 예를 들어 Mon (8,20), ..., Sun (0,0)과 같이 각 요일의 영업 시간을 어떻게 정의 하시겠습니까?
simou

1
@simou 그런 다음 실제로 봉인 된 특성과 실제 하위 클래스를 사용해야합니다. 하지만 저는이 시나리오를 "열거"라고 부르지 않습니다. 작성하는 것이 더 좋을 수 Open(Mon, 8, 20)있으며 날짜는 평평한 열거로 유지됩니다.
0__
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.