gpt4 book ai didi

scala - 使用 Scala 2.10 隐式类转换为 "built-in"标准库类

转载 作者:行者123 更新时间:2023-12-01 01:12:18 25 4
gpt4 key购买 nike

我正在尝试使用新的 Scala 2.10 implicit class转换 java.sql.ResultSet 的机制到 scala.collection.immutable.Stream .在 Scala 2.9 中,我使用以下代码,该代码有效:

/**
* 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 defimport 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
}

最佳答案

我在这里看不到使用隐式类的理由。坚持你的第一个版本。隐式类主要用于(如“简洁”)向现有类型添加方法(所谓的“丰富我的库”模式)。
它只是包装类的语法糖和对此类的隐式转换。

但是在这里,您只是从一个 转换(隐式)预先存在的键入另一个 预先存在的类型。根本不需要定义新类(更不用说隐式类了)。

在你的情况下,你 可以通过 ResultSetStream 使用隐式类使其工作延长 Stream并作为toStream 的代理实现.但这真的很麻烦。

关于scala - 使用 Scala 2.10 隐式类转换为 "built-in"标准库类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com