1

我对斯卡拉很陌生。我试图创建一种动态存储库。如何读取简单案例类的属性?

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] {}
4

2 回答 2

1

scala 中的案例类扩展了 Product(请参见此处)。也许以下代码会对您有所帮助(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])。

于 2012-06-04T12:10:47.313 回答
1

为什么不将实体表示为地图?然后,您可以轻松地将键作为属性进行迭代,并做 Scala 映射可以做的所有其他花哨的事情。

如果你想隐藏表示,那么你应该使用组合,即将地图存储为私有字段。

这样的事情可以让你开始:

class Entity {
  private[this] val map = collection.mutable.Map[String, Any]()
  def name = map("name").asInstanceOf[String]
  def attributes = map.keys
  ...
}
于 2012-06-04T12:39:53.377 回答