2016-02-23 2 views
1

У меня есть несколько полей, которые я хочу, чтобы создать перечисление из, но эти поля имеют 2 значения: Valid и Not valid:DEFINE SCALA перечисление с 2-мя свойствами

object MyEnum extends Enumeration 
{ 
    val 
    type1, // this type is valid 
    type2, // valid 
    type3, // valid 
    type4, // Not valid 
    type5, // Not valid 
    type6, // Not valid 
    type7 // Not valid 
    = value 
} 

Любое предложение, как различать между Valid и Not valid через код? или, может быть, он должен разделяться на 2 перечисления?

ответ

0

Вы можете создать функцию на объект Enum и использовать .ToString часть Enumeration.Value

object MyEnum extends Enumeration { 

    val type1 = Value("valid") 
    val type2 = Value("valid") 
    val type3 = Value("valid") 
    val type4 = Value("Not valid") 
    val type5 = Value("Not valid") 
    val type6 = Value("Not valid") 
    val type7 = Value("Not valid") 

    lazy val lookup = this.values.map { n => (n, n.toString == "valid") }.toMap 

    def isValid(myEnum: MyEnum.Value) = lookup.getOrElse(myEnum, false) 
} 

MyEnum.isValid(MyEnum.type1)      //> res0: Boolean = true 
MyEnum.isValid(MyEnum.type7)      //> res1: Boolean = false 

Источники: https://github.com/scala/scala/blob/v2.11.7/src/library/scala/Enumeration.scala#L146 http://www.scala-lang.org/api/current/#scala.Enumeration $ Value

+0

Зачем мне этот номер перечисления? (например, число 0 для первого перечисления) –

+0

@ davidhol это обычно генерируется автоматически для каждого из перечислений, но требуется указать при указании параметра 'name'. Возможно, обратите внимание на этот конкретный вариант использования. Существует также https://github.com/scala/scala/blob/v2.11.7/src/library/scala/Enumeration.scala#L139 ' @param i Целое число, которое идентифицирует это значение во время выполнения. Он должен быть * уникальным среди всех значений перечисления. ' – sam

+0

@ davidhol Я обновил пример, чтобы не указывать индекс, и пусть Enumeration определит его с nextId в перегруженном методе. – sam

0

Там в другой шаблон, который вы можете использовать, что не распространяется Перечень, но действует так же:

object MyEnum extends Serializable { 
    abstract sealed class MyEnum(
    val ordinal: Int, val isValid: Boolean 
) extends Ordered[MyEnum] with Serializable { 
    def compare(that: MyEnum) = that.ordinal compare this.ordinal 

    def toInt: Int = this.ordinal 
    } 

    case object Type1 extends MyEnum(0, true) 
    case object Type2 extends MyEnum(1, true) 
    case object Type3 extends MyEnum(2, true) 
    case object Type4 extends MyEnum(3, false) 
    case object Type5 extends MyEnum(4, false) 
    case object Type6 extends MyEnum(5, false) 
    case object Type7 extends MyEnum(6, false) 

    def fromInt(i: Int): MyEnum = values.find(_.ordinal == i).get 

    val values = Set(
    Type1, Type2, Type3, Type4, Type5, Type6, Type7 
) 
} 

Таким образом, вы можете назначить таким образом, как val myEnum: MyEnum.MyEnum = MyEnum.Type1 аналогично вашему примеру выше, и вы будете иметь доступ к myEnum.isValid. Аналогично, вы можете получить доступ к нему по порядку с помощью метода fromInt. Например, MyEnum.fromInt(0).isValid. Если вы предоставите еще какой-то контекст того, что вы пытаетесь сделать со значениями, я могу предложить лучшее решение. Надеюсь это поможет.

+0

Читаю выпадающий список из HTML страницы используя селен, и этот список имеет несколько опций, некоторые из которых действительны, а некоторые нет, эти параметры требуют отправки этой формы, я хочу заполнить эту форму автоматически, и если эта опция действительна, окончательный статус после сохранения формы будет иным, недействительно. –

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