2010-12-17 3 views
2

J'ai cet objet de domaine:Scala + MongoDB: champs facultatifs et immutables

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

avec le champ facultatif d'âge. Donc, je définissais mon usine:

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) 
} 

mais il ne compile pas, depuis que je reçois:

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

Quel est le problème avec ça?

Répondre

4

peut-être, vous pourriez écrire

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

merci vous , Ça marche. Certainement, je dois en apprendre plus sur la correspondance de modèles dans Scala. – onof

1

Vous devez envelopper t dans un Certains objet

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

de cette façon, je n'aurai jamais le cas de Aucun – onof

+0

Ensuite, ce que amsayk suggéré devrait fonctionner comme 'l'âge de dbo' retournera un objet d'option. – Monkey

3

Une variante de la réponse de amsayk, mais un peu plus symétrique

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

ouah! Merci beaucoup! +1 – onof

Questions connexes