新しい Scala 2.10 メカニズムを使用して a を に変換しようとしていimplicit class
ます。Scala 2.9 では、動作する次のコードを使用します。java.sql.ResultSet
scala.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
}
}
}
ただし、ここで を呼び出す必要がありますtoStream
。ResultSet
これにより、「暗黙の」部分が無効になります。
val resultSet = statement.executeQuery("SELECT * FROM foo")
resultSet.toStream.map {
row => /* ... */
}
私は何を間違っていますか?
「機能」警告を回避するために、引き続きimplicit def
andを使用する必要がありますか?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
}