Question

Ceci est ma première question ici, donc j'espère fournir suffisamment de détails. Ne hésitez pas à demander des éclaircissements.

Prendre en considération les éléments suivants, qui fonctionne:

implicit def optionBsonReader[T, U](implicit ev: BsonReader[T, U]) = new BsonReader[Option[T], Option[U]] {
  def read(obj: Option[U]): Option[T] = {
    obj match {
      case Some(x) => Some(x.fromBson[T])
      case None => None
    }
  }
}

ce morceau de code convertis Option enveloppé morceaux de BSON à une autre option [T]. Je pensais que même fonctionnerait pour les listes, mais ce qui suit ne compile pas:

implicit def listBsonReader[T, DBObject](implicit ev: BsonReader[T, DBObject]) = new BsonReader[List[T], MongoCursor] {
  def read(cur: MongoCursor): List[T] = {
    cur.map(_.fromBson[T]).toList
  }
}

Je suis en utilisant le code suivant pour la mécanique générale:

package object bson {

  def bsonReader[A, B](implicit reader: BsonReader[A, B]) = reader
  def bsonWriter[A, B](implicit writer: BsonWriter[A, B]) = writer

  implicit def addWriter[A](any: A): WithWriter[A] = new WithWriter(any)
  implicit def addReader[A](any: A): WithReader[A] = new WithReader(any)
}

package bson {
  private[bson] class WithWriter[A](any: A) {
    def toBson[B](implicit writer: BsonWriter[A, B]): B = writer.write(any)
  }
  private [bson] class WithReader[B](any: B) {
    def fromBson[A](implicit reader: BsonReader[A, B]): A = reader.read(any)
  }
}

erreur du compilateur: could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList

Cela me paraît étrange, car il semble que le compilateur tente d'évaluer T avant fromBson a été appelé à fournir un type. Cela me paraît d'autant plus étrange puisque le lecteur d'option semble avoir aucune plainte. J'ai récemment commencé à code Scala pour de bon, donc je suis sûr que je manque quelque chose ici.

S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations et espérons que vous pouvez aider.

Best,

Dirk

Était-ce utile?

La solution

Dans votre listBsonReader, il n'y a aucune raison pour le type U. Votre curseur itérer sur dbobject, carte attend une fonction DbObject => X. Je suppose que vous avez quelque chose comme

implicit def withFromBson[U](x: U) = new {
   def fromBson[T](implicit ev : BsonReader[T,U]) : T = ...
}

Dans la carte, avec _ typé DBObject, il est, à la recherche tout à fait normalement de BsonReader[T, DBObject]. Vous fournissez aucune portée implicite, seule une BsonReader[T,U]. Il suffit de retirer U et que votre paramètre implicite soit BsonReader[T,DBObject].

Le compilateur ne cherche pas à évaluer T à l'avance. Il essaie de faire en sorte que tout T et U peut-être sur le site d'appel, (dans ce cas, U est le problème), il aura le BSonReader[T, DBObject] implicite dont elle a besoin portée implicite. Je suppose qu'il n'y a pas dans l'environnement général. Vous promettez, avec votre paramètre implicite, que vous donnerez un BsonReader[T,U] sur le site d'appel. Ce n'est pas ce dont il a besoin. Lorsque le paramètre non implicite (vous auriez à écrire le ev à lors de l'appel fromBson), vous auriez une erreur semblable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top