2

一般的な暗黙の変換を書くのを手伝ってもらえますか?

Scala 2.10.2 と Spray 1.2 を使用しています。

これが私が持っているものです

// for "parameters"
implicit def ObjectIdUnmarshallerString = new Deserializer[String, ObjectId] {
  def apply(value: String) =
    try Right(new ObjectId(value))
    catch {
      case ex: Throwable => Left(MalformedContent(s"Cannot parse: $value", ex))
    }
}

//  for "formParameters"
implicit def ObjectIdUnmarshallerHttpEntity = new Deserializer[HttpEntity, ObjectId] {
  def apply(value: HttpEntity) = ObjectIdUnmarshallerString(value.asString)
}

ご覧のとおり、HttpEntity->ObjectId のデシリアライザーは単純に String->ObjectId デシリアライザーを使用します。HTTP ルーティング トレイトで使用するクラスごとに、そのようなコードをコピー アンド ペーストする必要があります。

Deserializer[String, T]そこで、スコープ内で availableを使用するジェネリック HttpEntity->T を記述できたらどうなるか考えました。

私はこれを試しました:

  implicit def GenericUnmarshallerHttpEntity[T] = new Deserializer[HttpEntity, T] {
    def convertAsString(value: HttpEntity)(implicit conv: Deserializer[String, T]) = conv(value.asString)

    def apply(value: HttpEntity) = convertAsString(value)
  }

悲しいことに、それはうまくいきません。そして、次のように述べています。

could not find implicit value for parameter conv: spray.httpx.unmarshalling.Deserializer[String,T]
    def apply(value: HttpEntity) = convertAsString(value)
                                                  ^

not enough arguments for method convertAsString: (implicit conv: spray.httpx.unmarshalling.Deserializer[String,T])spray.httpx.unmarshalling.Deserialized[T].
Unspecified value parameter conv.
    def apply(value: HttpEntity) = convertAsString(value)
                                                  ^

それを行う方法を提案していただけますか?

4

2 に答える 2

2

implicit def GenericUnmarshallerHttpEntity[T](implicit conv: Deserializer[String, T]) = ...から暗黙的なパラメーターを削除してみてくださいconvertAsString

問題にapplyあるように、暗黙的がスコープ内にある必要はないため、convertAsStringメソッドを呼び出すことはできません。

于 2013-08-06T02:30:25.687 に答える
0

適用関数には、変換メソッドに暗黙的に渡す必要があります

implicit def GenericUnmarshallerHttpEntity[T] = new Deserializer[HttpEntity, T] {
  def convertAsString(value: HttpEntity)(implicit conv: Deserializer[String, T]) = conv(value.asString)

  def apply(value: HttpEntity)(implicit conv: Deserializer[String, T]) = convertAsString(value)
}
于 2013-08-06T01:50:22.343 に答える