Najbliższy rzecząW bieżącym Scala, istnieje przejrzysty sposób zrobić „lazy konstruktora wzorca”
case class Foo(lazy next: Foo)
że udało mi się wymyślić jest
class Foo(_next: =>Foo) {
lazy val next = _next
}
object Foo {
def apply(next: =>Foo) = new Foo(next)
def unapply(foo: Foo) = Some(foo.next)
}
znalazłem wymieniony numer: add lazy parameters, więc myślę, że pewnego dnia zostanie dodany . W międzyczasie czy ktoś zna czystszą sztuczkę niż powyższe?
Warto wspomnieć, że 'metoda unapply' nie jest leniwy, więc stara się dopasować wzór' Foo' do innego 'Foo' spowoduje' next' poddawanych ocenie, która może nie chcieć. –
@BrianMcCutchon To dobry punkt. Przypuszczam, że jedynym sposobem na to, aby był leniwy, byłoby dodanie indirectingu, jak w 'def unapply (foo: Foo) = Some (() => foo.next)? – Owen
To wydaje się działać. Po prostu unikałem używania 'unapply' dla moich leniwych klas przypadków. W takim przypadku musisz jednak jawnie wywołać funkcję, np. 'Case Foo (n) => Foo (doSomething (n()))'. W tym momencie lepiej użyć "Need". (Jeśli przejdziesz do trasy 'Need', możesz zdefiniować przeciążony konstruktor dla' Foo', który pobiera parametr wywoławczy i zmienia go w 'Need'.) –