2012-04-19 10 views
3

なぜスケーラの列挙型を参照できないのか分かりません。スカラーを参照する方法他のパッケージから列挙する

問題は時々、私は列挙型を参照することができるということです。

enum(UserStatus) 

、時にはそれは私が時々列挙クラスを参照することはできませんどのように来るのenum

not found: type UserStatus 

を見つけることができない文句?

列挙型用に生成されたソースはOKのようです、そしてそれは同じ場所、同じ使用に住んでいる私が持っている別の列挙型を持つ素晴らしい作品...

任意の提案ですか?

詳細情報

がenumのための生成されたソースは、次のとおりです。

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)) 

これは、フォームバインディングを使用すると、マッパーが列挙型に自動的に変換することを意味します。

疑似コードです。

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

私はそれを試しました、魅力のように働きます...クールな解決策:) –

+0

私はそれをコアに引き込もうとしています。しかし私は列挙が彼らがするべきであるように働くことを恥ずべきではない。あなたがコントローラの列挙型を参照することに何らかの問題があるかどうか教えてください。それはコンパイラが私に苦労している場所です。 –

+0

'import models._'はすべてをスコープに入れます。私が追加したのは 'type UserStatus = Value'だけでした(しかし、私はそれが必要であるとは確信していません)。コードをGithubに置くことはできますか?これまでのところ私はそれに問題はないと思う。 –

答えて

8

あなたの問題は、Scalaであなたがタイプためとに同じ識別子を使用することができるという事実から来るかもしれません。

次書くとき:

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オブジェクトを意味し、2行目はFooタイプを指します。

+0

この回答がOPをどのように解決するのか混乱しています。あなたはenum型のためにScalaの一般的な解決策を与えていますが、Scala-Playフォームに列挙型を供給するという問題は解決しません。 –

関連する問題