4

新しい Scala 2.10 メカニズムを使用して a を に変換しようとしていimplicit classます。Scala 2.9 では、動作する次のコードを使用します。java.sql.ResultSetscala.collection.immutable.Stream

/**
 * Implicitly convert a ResultSet to a Stream[ResultSet]. The Stream can then be
 * traversed using the usual methods map, filter, etc.
 *
 * @param resultSet the Result to convert
 * @return a Stream wrapped around the ResultSet
 */
implicit def resultSet2Stream(resultSet: ResultSet): Stream[ResultSet] = {
  if (resultSet.next) Stream.cons(resultSet, resultSet2Stream(resultSet))
  else {
    resultSet.close()
    Stream.empty
  }
}

次に、次のように使用できます。

val resultSet = statement.executeQuery("SELECT * FROM foo")
resultSet.map {
  row => /* ... */
}

implicit class私が思いついたのは次のようになります。

/**
 * Implicitly convert a ResultSet to a Stream[ResultSet]. The Stream can then be
 * traversed using the usual map, filter, etc.
 */
implicit class ResultSetStream(val row: ResultSet)
  extends AnyVal {
  def toStream: Stream[ResultSet] = {
    if (row.next) Stream.cons(row, row.toStream)
    else {
      row.close()
      Stream.empty
    }
  }
}

ただし、ここで を呼び出す必要がありますtoStreamResultSetこれにより、「暗黙の」部分が無効になります。

val resultSet = statement.executeQuery("SELECT * FROM foo")
resultSet.toStream.map {
  row => /* ... */
}

私は何を間違っていますか?

「機能」警告を回避するために、引き続きimplicit defandを使用する必要がありますか?import scala.language.implicitConversions

アップデート

ResultSetを に変換する代替ソリューションを次に示しますscala.collection.Iterator(Scala 2.10 以降のみ)。

/*
 * Treat a java.sql.ResultSet as an Iterator, allowing operations like filter,
 * map, etc.
 *
 * Sample usage:
 * val resultSet = statement.executeQuery("...")
 * resultSet.map {
 *   resultSet =>
 *   // ...
 * }
 */
implicit class ResultSetIterator(resultSet: ResultSet)
extends Iterator[ResultSet] {
  def hasNext: Boolean = resultSet.next()
  def next() = resultSet
}
4

1 に答える 1

4

ここで暗黙のクラスを使用する理由はわかりません。あなたの最初のバージョンに固執します。暗黙のクラスは、主に(「簡潔」のように)既存の型にメソッドを追加するのに役立ちます(いわゆる「ライブラリを充実させる」パターン)。これは、ラッパークラスの構文糖衣であり、このクラスへの暗黙の変換です。

ただし、ここでは、ある既存のタイプから別の既存のタイプに(暗黙的に)変換しているだけです。新しいクラスを定義する必要はまったくありません(暗黙のクラスは言うまでもありません)。

あなたの場合、extendを作成し、のプロキシとして実装することで、暗黙のクラスを使用して機能させることができます。しかし、それは本当に多くの問題を引き起こします。ResultSetStreamStreamtoStream

于 2013-02-06T14:56:43.360 に答える