我对scala很新。我试图创建一种动态存储库。我如何阅读简单案例类的属性?
trait Repository[T <:MetaEntity] {
persist(entity:T) : Boolean {
// TO BE IMPLEMENTED
// Pseudo code:
for (attribute <- getAttributes()) {
// Flatten properies to one string...
// Primitives can be converted with attribute.value.toString ?
// Type: attribute.type ?
// Object references should be coverted to object.id.toString ?
}
}
}
abstarct class MetaEntity {}
case class SimpleEntity(id: Int, name: String, version: Int) extends MetaEntity {
}
case class ComplexEntity(id: Int, name: String, simpleChild: SimpleEntity) extends MetaEntity{}
object ComplexEntityRepository extends Repository[ComplexEntity] {}
object SimpleEntityRepository extends Repository[SimpleEntity] {}
答案 0 :(得分:1)
scala中的案例类扩展了Product(请参阅here)。 也许以下代码将帮助您(REPL会话):
scala> trait MetaEntity extends Product
defined trait MetaEntity
scala> case class Test(i: Int, j: Int) extends MetaEntity
defined class Test
scala> def test[T <: MetaEntity](t: T) = {
| for (elem <- t.productIterator)
| println(elem.getClass.getName + " " + elem)
| }
test: [T <: MetaEntity](t: T)Unit
scala> test(Test(1,2))
java.lang.Integer 1
java.lang.Integer 2
要阅读“内部”产品的属性,您可以进行类型检查(例如iter.next.isInstanceOf [Product])。
答案 1 :(得分:1)
为什么不将您的实体表示为地图?然后,您可以轻松地将键作为属性进行迭代,并执行Scala映射可以执行的所有其他奇特的操作。
如果要隐藏表示,则应使用合成,即将地图存储为私有字段。
这样的事情可以让你开始:
class Entity {
private[this] val map = collection.mutable.Map[String, Any]()
def name = map("name").asInstanceOf[String]
def attributes = map.keys
...
}