2016-10-21 6 views
2

В моем текущем проекте мне нужно определить множество объектов case, подклассифицирующих один запечатанный признак. Имена этих объектов имеют шаблон, например, Case1, Case2, Case3, ..., CaseN. Мне было интересно, есть ли способ в scala для определения всех этих объектных объектов программным способом, например, с помощью цикла, вместо того, чтобы писать N строк определений.Можно программно определить объекты Case Scala?

Если это осуществимо, было бы здорово это сделать во время компиляции, так что известно, что объекты случая, определенные таким образом, проверяют тип. Это звучит невозможно на большинстве языков (у вас могут быть либо динамически определенные типы, как в python, либо иметь статическую безопасность типа, как в C/C++, но не для обоих), но, возможно, в Scala это возможно для мощного отражения во времени компиляции?

+0

Но почему вы не создать класс, а затем создавать объекты во время выполнения? –

+0

Поскольку вы не можете выполнить сопоставление шаблонов на экземплярах класса, особенно с исчерпывающим сопоставлением шаблонов. – uraj

+0

Как насчет соответствия шаблону некоторым свойством класса? Создайте объекты с шаблоном по свойству, а затем сопоставьте их с этим свойством –

ответ

0

Я думаю об этом решении:

trait customTrait{ 
    val property: String 
} 

case class toMatch(property: String) extends customTrait{ 
} 

val cases: Seq[toMatch] = for{ 
    x <- 0 until 10 
} yield toMatch("property" + x) 

def matchCase(caseToMatch: customTrait): String = caseToMatch match{ 

    case toMatch("property1") => "1" 
    case toMatch("property2") => "2" 
    case toMatch("property3") => "3" 
    case toMatch("property4") => "4" 
    case _ => "non" 

} 

for { 
    x <- cases 
} yield matchCase(x) 
+0

Этот фрагмент код работает, но, как я уже упоминал, ему не хватает статической проверки на случаи, которые вы написали в блоке соответствия. Если кто-то забывает добавить случай, скажем, «property3», компилятор не выдаст предупреждение. С другой стороны, если вы не учитываете случай с дикой картой, компилятор всегда выдаст предупреждение. – uraj