2014-02-08 4 views
1

Мне нужно сгруппировать некоторые значения Enumeration.Scala перечисление и группа значений

Вот код:

object PostType extends Enumeration { 
    // Documents 
    val BOOKMARK = Value("bookmark") 
    val FILE = Value("file") 
    val NOTE = Value("note") 
    val WIKIDOC = Value("wikidoc") 

    …  
} 

object PostTypes { 
    type PostTypes = List[PostType.Value] 
    val DOCUMENTS : PostTypes = List(PostType.BOOKMARK, PostType.FILE, PostType.NOTE, PostType.WIKIDOC) 
    val QUESTIONS : PostTypes = List(PostType.QUESTION, PostType.QUICKPOLL, PostType.SURVEY) 
    val EVENT : PostTypes = List(PostType.EVENT) 
    … 
    val ALL : PostTypes = PostType.values.toList 
} 

Есть ли лучший способ? Вот минусы, которые я вижу: PostType.Value и PostTypes.PostTypes в коде клиента!

[обновление] улучшить код с помощью как ответы

object PostType extends Enumeration { 
    // Documents 
    val Bookmark = Value("bookmark") 
    val File = Value("file") 
    val Note = Value("note") 
    val Wikidoc = Value("wikidoc") 
    … 
} 

object PostTypes { 
    import PostType._ 
    implicit def toList(pt: Value) = List(pt) 

    type PostTypes = List[Value] 
    val Documents = List(Bookmark, File, Note, Wikidoc) 
    val Questions = List(Question, Quickpoll, Survey) 
    val All = values.toList 
} 

[обновление 2] Еще одна куча улучшений

object PostType extends Enumeration { 
    type PostType = Value 
    type PostTypes = List[Value] 

    implicit def toList(pt: Value) = List(pt) 

    // Documents 
    val Bookmark = Value(1, "bookmark") 
    val File = Value(2, "file") 
    val Note = Value(3, "note") 
    val Wikidoc = Value(12, "wikidoc") 

    // Declare after Val to avoid runtime error 
    val Documents = List(Bookmark, File, Note, Wikidoc) 
    val Questions = List(Question, Quickpoll, Survey) 
    val All = values.toList.sorted 
} 

ответ

0

Вот окончательный код, с помощью других ответов. Просто нужно import PostType._ в клиентском коде.

object PostType extends Enumeration { 
    type PostType = Value 
    type PostTypes = List[Value] 

    implicit def toList(pt: Value) = List(pt) 

    // Documents 
    val Bookmark = Value(1, "bookmark") 
    val File = Value(2, "file") 
    val Note = Value(3, "note") 
    val Wikidoc = Value(12, "wikidoc") 

    // Declare after Val to avoid runtime error 
    val Documents = List(Bookmark, File, Note, Wikidoc) 
    val Questions = List(Question, Quickpoll, Survey) 
    val All = values.toList.sorted 
} 
2

Я думаю, что это так хорошо, как он получает, если вы не хотите использовать альтернативный вариант перечисления (см. мой ответ here) или просто используйте некоторые константы.

Единственное, что я могу предложить, это определить псевдоним типа type PostType = Value и использовать его вместо Value. Я уверен, что вы знаете, что при импорте <package>.PostType._ вам больше не придется префиксные значения перечисления с PostType.

Наконец PostTypes кажется немного похож на излишний, и его легко сбить с PostType при чтении. Это всего лишь незначительные вещи. Я использую тот же подход, что и вы, и я не знаю ничего лучшего.

+0

скорее, импортировав PostType._, чтобы опустить префикс (импорт PostType.Value, похоже, не выполняет эту работу)? –

+0

good point @YannMoisan –

3

Ниже приведен подход, который не использует перечисления, но, надеюсь, достигает ваших целей. В этом примере показано, как создать экземпляр PostType из экземпляра String. Если String не соответствует, то бросается MatchError.

package rando 

object PostType { 
    val all = Document.all ++ Question.all 
    def fromString(s: String): PostType = Document.fromString.orElse(Question.fromString)(s) 
} 
sealed trait PostType 

object Document { 
    val all = Set(Bookmark, File, Note, Wikidoc) 
    val fromString: PartialFunction[String, Document] = { 
    case "bookmark" => Bookmark 
    case "file" => File 
    case "note" => Note 
    case "wikidoc" => Wikidoc 
    } 
} 
sealed trait Document extends PostType 
case object Bookmark extends Document 
case object File extends Document 
case object Note extends Document 
case object Wikidoc extends Document 

object Question { 
    val all = Set(SlowPoll, QuickPoll, Survey) 
    val fromString: PartialFunction[String, Question] = { 
    case "slowpoll" => SlowPoll 
    case "quickpoll" => QuickPoll 
    case "survey" => Survey 
    } 
} 
sealed trait Question extends PostType 
case object SlowPoll extends Question 
case object QuickPoll extends Question 
case object Survey extends Question 

object Example extends App { 
    println(PostType.fromString("bookmark").getClass) 
} 
+0

Мне нужно создать экземпляр PostType из 'String' (данные поступают из текстового файла) –

+0

Я обновил ответ, чтобы создать экземпляр' PostType' из 'String'. –

Смежные вопросы