3

これはここでの最初の質問なので、十分な詳細を提供していただければ幸いです。ご不明な点がございましたらお気軽にお問い合わせください。

次の点を考慮してください。

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 で本格的にコードを書き始めたばかりなので、ここで何かが欠けていると確信しています。

さらに情報が必要な場合はお知らせください。お役に立てれば幸いです。

一番、

ダーク

4

1 に答える 1

2

listBsonReader には、タイプ U の理由はありません。カーソルは DBObject で反復処理され、map はDbObject => X関数を期待しています。私はあなたがのようなものを持っていると思います

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

map では、_typedDBObjectを使用して、通常は から見ていBsonReader[T, DBObject]ます。暗黙的なスコープでは何も提供せず、BsonReader[T,U]. 削除Uして、暗黙のパラメーターを にするだけBsonReader[T,DBObject]です。

コンパイラはT事前に評価しようとはしていません。呼び出しサイトにあるものは何でも(この場合は問題です)、 暗黙的なスコープに必要な暗黙的なものがあることを確認しようとしてTいます。一般的な環境では無いと思います。暗黙のパラメーターを使用して、呼び出しサイトでパラメーターを与えることを約束します。それは必要なものではありません。パラメータが暗黙的でない場合 ( を呼び出すときに ev at を記述する必要があります)、同様のエラーが発生します。UUBSonReader[T, DBObject]BsonReader[T,U]fromBson

于 2011-09-06T05:56:00.637 に答える