2013-02-05 115 views
1

我妈想下面的Scala 2.9隐式转换方法转换为2.10隐类:转换Scala的隐式转换方法为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没有带参数。

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

回答

5

试试这个:

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 
     } 
    } 
    } 
+0

感谢。一般来说,我仍然试图将自己的头围绕在Streams上。同时学习Haskell和懒惰有时会让人困惑。 – Ralph