2012-04-19 5 views
3

스칼라 열거 형식을 참조 할 수없는 이유를 이해하는 데 문제가 있습니다.스칼라 참조하는 방법 다른 패키지의 열거 형

문제는 가끔 열거 참조 할 수 있다는 것입니다 :

enum(UserStatus) 

을 때로는 약 열거

not found: type UserStatus 

어떻게 때로는 열거 클래스를 참조 할 수 없습니다 올를 찾을 수 없다는 불평?

제안 ...

열거의 생성 된 소스는 괜찮을 것, 그리고 내가 같은 장소, 같은 사용에 살고있는이 또 다른 열거와 함께 잘 작동?

더 많은 정보

열거의 생성 된 소스는 다음과 같습니다

public final class models.UserStatus extends java.lang.Object{ 
    public static final scala.Enumeration$Value Busy(); 
    public static final scala.Enumeration$Value Free(); 
    public static final scala.Enumeration$ValueSet$ ValueSet(); 
    public static final scala.Enumeration$Value withName(java.lang.String); 
    public static final scala.Enumeration$Value apply(int); 
    public static final int maxId(); 
    public static final scala.Enumeration$ValueSet values(); 
    public static final java.lang.String toString(); 
} 
내가 플레이 프레임 워크 2.0

def enumFormat[E <: Enumeration](enum: E): Formatter[E#Value] = new Formatter[E#Value] { 
    def bind(key: String, data: Map[String, String]) = { 
    Formats.stringFormat.bind(key, data).right.flatMap { s => 
     scala.util.control.Exception.allCatch[E#Value] 
     .either(enum.withName(s)) 
     .left.map(e => Seq(FormError(key, "error.enum", Nil))) 
    } 
    } 
    def unbind(key: String, value: E#Value) = Map(key -> value.toString) 
} 

에 대한 열거 매퍼를 구현하기 위해 노력하고있어

그리고 호출이 방법 매퍼

def enum[E <: Enumeration](enum: E): Mapping[E#Value] = of(enumFormat(enum)) 

이것은 매퍼가 양식 바인딩을 사용할 때 enum 사이를 자동으로 변환 함을 의미합니다.

가짜 의사 코드.

package models { 
    object UserStatus extends Enumeration { 
    val Free = Value("free") 
    val Busy = Value("busy") 
    } 

    case class User(
    status: UserStatus.Value = UserStatus.Free 
) 
} 

package controllers { 
    imports models._ 
    val userForm = Form(
    mapping(
     "status" -> enum(UserStatus) 
    )(User.apply)(User.unapply) 
) 
} 
+0

나는 그것을 시험해 보았다. 매력처럼 작동한다. cool solution :) –

+0

나는 그것을 코어에 넣으려고 노력하고있다. 하지만 열거 형은 꼭해야만하는대로 작동하는 것이 좋을 것 같지는 않습니다. 컨트롤러에서 Enum을 참조하는 데 문제가 있는지 알려주십시오. 그건 컴파일러가 나에게 힘든 시간을주는 곳입니다. –

+0

'import models._'는 모든 것을 범위로 가져와야합니다. 내가 추가 한 유일한 것은'type UserStatus = Value'이었습니다 (그러나 나는 그것이 필요하다는 것을 확신하지 못했습니다). Github에 코드를 넣을 수 있습니까? 지금까지 나는 그것에 아무런 문제가 없다. –

답변

8

귀하의 문제는 스칼라에서 당신이 유형에 대한과 에 대해 동일한 식별자를 사용할 수 있다는 점에서 올 수 있습니다.

다음 쓰기

는 :
object Foo extends Enumeration { 
    val A, B, C = Value 
} 

당신은 Foo 객체를 정의하지만 당신은 Foo 유형을 정의하지 않습니다. Java 백그라운드에서 온 경우 이 아닐 수 있습니다.이 동작은 직관적 인 것입니다.

Foo 열거 값의 유형은 무엇입니까? 유형은 Foo.Value이며 경로 종속 유형이라고합니다.

object Foo extends Enumeration { 
    type Foo = Value // Type alias 
    val A, B, C = Value 
} 

지금 당신이 Foo.Foo를 작성하여 열거 형을 참조 할 수 있습니다 : 당신이 열거 형 값 유형에 해당하는 Foo 유형을 정의하려면

, 당신은 Foo.Value 유형 별칭을 할 수 있습니다.넌 구문 오버 헤드를 줄이기 위해 Foo 오브젝트의 필드를 가져올 수

위의 코드에서
import Foo._ 
def bar(foo: Foo): String = foo match { 
    case A => "value A" 
    case B => "value B" 
    case C => "value C" 
} 

, 첫 번째 행은 Foo객체 지칭하고, 두 번째 행은 Foo을 말한다.

+0

이 답변으로 OP가 어떻게 해결되는지 혼란 스럽습니다. 당신은 enum 타입에 대한 일반적인 스칼라 솔루션을 제공하고 있습니다. 스칼라 플레이 폼에 enum 타입을 공급하는 문제는 해결되지 않습니다. –

관련 문제