2010-12-17 35 views
2

我有這樣的域對象:斯卡拉+ MongoDB的:可選字段和immutables

case class Person (
    name : String, 
    age: Option[Int], 
    email : String 
) extends MongoObject 

隨着年齡的可選字段。所以我定義我廠:

object Person extends MongoObjectShape[Person] { 
    lazy val name = Field.scalar("name", _.name) 
    lazy val age = Field.optional("age", t => t.age) 
    lazy val email = Field.scalar("email", _.email) 

    override lazy val * = name :: age :: email :: Nil 
    override def factory(dbo: DBObject): Option[Person] = 
    for { 
     n <- name from dbo 
     t <- age from dbo 
     z <- email from dbo 
    } yield new Person(n, t, z) 
} 

,但它並沒有編譯,因爲我得到:

[error] found : Int 
[error] required: Option[Int] 
[error]  } yield new Person(n, t, z) 
[error]       ^

有什麼不對呢?

回答

4

也許,你可以寫

override def factory(dbo: DBObject): Option[Person] = 
    for { 
     n <- name from dbo 
     z <- email from dbo 
    } yield new Person(n, age from dbo, z) 
+0

謝謝包裝ŧ , 有用。當然,我必須在Scala中學習更多關於模式匹配的知識。 – onof 2010-12-17 18:32:35

1

你需要在一些對象

} yield new Person(n, Some(t), z) 
+0

那種方式我永遠不會有無 – onof 2010-12-17 18:23:53

+0

那麼amsayk建議應該作爲'年齡從dbo'工作將返回一個選項對象。 – Monkey 2010-12-17 18:37:47

3

amsayk的回答的一個變種,但稍微對稱

for { 
     n <- name from dbo 
     t = age from dbo 
     z <- email from dbo 
    } yield new Person(n, t, z) 
+0

哇!非常感謝你! +1 – onof 2010-12-20 07:29:10