2013-07-15 1 views
1

Я читал в какой-то теме, как сопоставить класс case с картой в scala. К сожалению, ни один из представленных ответов не является достаточно хорошим.Как преобразовать граф объекта класса в Map

Мой пример будет иметь что-то вроде:

case class A(a1: String, a2: String, a3: C) 

case class C(c1: String, c2: String, c3: D) 

case class D(d1: String, d2: String) 

Если предположить, что мы имеем следующие случаи

val d = D(d1 ="valueForD1", d2 = "valueForD2") 
val c = C(c1 ="valueForc1", c2 = "valueForC2", c3 = d) 
val a = A(a1 ="valueForA1", a2 = "valueForA2", a3 = c) 

Я хочу, чтобы преобразовать этот случай класса графа в следующем виде:

Map("a1" -> "valueForA1", "a2" -> "valueForA2", 
    "a3" -> Map("c1" -> "valueForC1", "c2" -> "valueForc2", 
    "c3" -> Map("d1" -> "valueForD1", "d2" -> "valueFord2"))) 
+2

Вы смотрели на http://stackoverflow.com/questions/17223213/scala-macros-making-a-map- вне полей-в-а-класса-в-Скале? – sourcedelica

+0

Или http://stackoverflow.com/questions/1226555 –

ответ

-1

Это самый прямой подход, не очень масштабируемый, хотя ...

def toGraph(a: A): Map[String, Any] = 
    a match { 
    case A(a1,a2,C(c1,c2,D(d1,d2))) => Map(
     "a1" -> a1, 
     "a2" -> a2, 
     "a3" -> Map(
     "c1" -> c1, 
     "c2" -> c2, 
     "c3" -> Map(
      "d1" -> d1, 
      "d2" -> d2) 
     ) 
     ) 
    case _ => Map() 
    } 

Я полагаю, что для более «динамического» подхода, можно прибегнуть к macros

+0

Я ищу 100% динамическое решение. – user1669615

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