【发布时间】:2012-02-04 23:37:01
【问题描述】:
最近的东西
case class Foo(lazy next: Foo)
我能想到的是
class Foo(_next: =>Foo) {
lazy val next = _next
}
object Foo {
def apply(next: =>Foo) = new Foo(next)
def unapply(foo: Foo) = Some(foo.next)
}
我发现了一个列出的问题add lazy parameters,所以我想它会被添加 有一天。同时,有没有人知道比上面更干净的技巧?
【问题讨论】:
-
值得一提的是,您的
unapply方法并不懒惰,因此尝试将Foo模式匹配到另一个Foo将导致next被评估,您可能不想要. -
@BrianMcCutchon 这是一个很好的观点。我想让它变得懒惰的唯一方法是添加间接性,如
def unapply(foo: Foo) = Some(() => foo.next)? -
这似乎行得通。我只是避免在我的惰性案例类中使用
unapply。但是,在这种情况下,您需要显式调用该函数,例如case Foo(n) => Foo(doSomething(n()))。此时,使用Need可能会更好。 (另外,如果你走Need路由,你可以为Foo定义一个重载的构造函数,它接受一个按名称调用的参数并将其转换为Need。)
标签: scala constructor lazy-evaluation