【问题标题】:Converting a Scala implicit conversion method to a 2.10 implicit class将 Scala 隐式转换方法转换为 2.10 隐式类
【发布时间】:2013-02-06 02:41:20
【问题描述】:

我正在尝试将以下 Scala 2.9 隐式转换方法转换为 2.10 隐式类:

import java.sql.ResultSet

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

我的第一次尝试没有编译:

implicit class ResultSetStream(row: ResultSet) {
  def stream: Stream[ResultSet] = {
    if (row.next) Stream.cons(row, stream(row))
    else {
      row.close()
      Stream.empty
    }
  }
}

stream(row) 出现语法错误,因为 stream 没有参数。

这样做的正确方法是什么?

【问题讨论】:

    标签: scala implicit-conversion


    【解决方案1】:

    试试这个:

    scala> import java.sql.ResultSet
    import java.sql.ResultSet
    
    scala> implicit class ResultSetStream(row: ResultSet) {
         |     def stream: Stream[ResultSet] = {
         |       if (row.next) Stream.cons(row, row.stream)
         |       else {
         |         row.close()
         |         Stream.empty
         |       }
         |     }
         |   }
    defined class ResultSetStream
    

    你将stream定义为函数,所以stream(row)不能工作。

    您可以从AnyVal 继承来创建Value Class 并优化您的代码:

    implicit class ResultSetStream(val row: ResultSet) extends AnyVal {
        def stream: Stream[ResultSet] = {
          if (row.next) Stream.cons(row, row.stream)
          else {
            row.close()
            Stream.empty
          }
        }
      }
    

    【讨论】:

    • 谢谢。总的来说,我仍在尝试围绕 Streams 进行思考。学习 Haskell 和懒惰有时也令人困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2018-09-16
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多