これはここでの最初の質問なので、十分な詳細を提供していただければ幸いです。ご不明な点がございましたらお気軽にお問い合わせください。
次の点を考慮してください。
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
}
}
}
このコードは、Option でラップされた BSON の断片を別の Option[T] に変換します。リストでも同じことができると思いましたが、以下はコンパイルされません。
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
}
}
一般的なメカニズムには次のコードを使用しています。
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)
}
}
コンパイラ エラー:
could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList
型を提供するために fromBson が呼び出される前に、コンパイラが T を評価しようとしているように見えるので、これは奇妙に思えます。オプションリーダーにはそのような苦情はないように見えるので、これは特に奇妙に思えます。私は最近 Scala で本格的にコードを書き始めたばかりなので、ここで何かが欠けていると確信しています。
さらに情報が必要な場合はお知らせください。お役に立てれば幸いです。
一番、
ダーク