Класс случая для отображения в Scala

Большинство вышеупомянутых предложений технически не является C++, они - решения C.

Изучают использование станд.:: stringstream.

71
задан Xavier Guihot 18 December 2018 в 22:31
поделиться

2 ответа

Это должно сработать:

def getCCParams(cc: AnyRef) =
  cc.getClass.getDeclaredFields.foldLeft(Map.empty[String, Any]) { (a, f) =>
    f.setAccessible(true)
    a + (f.getName -> f.get(cc))
  }
86
ответ дан 24 November 2019 в 12:57
поделиться

Я не знаю насчет хороших ... но, похоже, это работает, по крайней мере, для этого самого простого примера. Вероятно, это требует некоторой работы, но может быть достаточно, чтобы вы начали? В основном он отфильтровывает все "известные" методы из класса case (или любого другого класса: /)

object CaseMappingTest {
  case class MyCase(a: String, b: Int)

  def caseClassToMap(obj: AnyRef) = {
    val c = obj.getClass
    val predefined = List("$tag", "productArity", "productPrefix", "hashCode",
                          "toString")
    val casemethods = c.getMethods.toList.filter{
      n =>
        (n.getParameterTypes.size == 0) &&
        (n.getDeclaringClass == c) &&
        (! predefined.exists(_ == n.getName))

    }
    val values = casemethods.map(_.invoke(obj, null))
    casemethods.map(_.getName).zip(values).foldLeft(Map[String, Any]())(_+_)
  }

  def main(args: Array[String]) {
    println(caseClassToMap(MyCase("foo", 1)))
    // prints: Map(a -> foo, b -> 1)
  }
}
2
ответ дан 24 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: