tra*_*ard 5 scala lazy-evaluation
我有一个看起来像这样的函数:
package org.thimblr.io
import java.io._
object Local {
def streamer(path: String) = () => new FileReader(path)
}
Run Code Online (Sandbox Code Playgroud)
这基本上管理我想要做的事情,即返回一个在调用时从文件中打开流的函数.所以客户端代码可以这样做:
val planStreamSource = Local.streamer("/home/someuser/.plan")
//...passes the function on to somewhere else
val planStream = planStreamSource()
val firstByte = planStream.read
//can now read from planStream
Run Code Online (Sandbox Code Playgroud)
但我真正喜欢的是返回一个lazy val,它在引用后从文件中流出,如下所示:
val planStream = Local.streamer("/home/someuser/.plan")
//...passes the val on to somewhere else, without opening the file for reading yet
val firstByte=planStream.read
//...such that planStream was only just opened to allow the read
Run Code Online (Sandbox Code Playgroud)
是否有可能做这样的事情,返回一个懒惰的val,以便客户端代码可以将其视为值而不是函数?
Jea*_*let 15
你不能"返回懒惰的val" - 客户端代码必须声明它是懒惰的.如果您不想强制客户端声明延迟val,则可以返回包装器:
class LazyWrapper[T](wrp: => T) {
lazy val wrapped: T = wrp
}
object LazyWrapper {
implicit def unboxLazy[T](wrapper: LazyWrapper[T]): T = wrapper.wrapped
}
Run Code Online (Sandbox Code Playgroud)
然后:
def streamer(path: String) = new LazyWrapper(new FileReader(path))
Run Code Online (Sandbox Code Playgroud)
如果需要equals,你可以进一步转发hashCode等等LazyWrapper.
| 归档时间: |
|
| 查看次数: |
1391 次 |
| 最近记录: |