en yakın şey , ben ile gelip mümkün olmuştur "tembel yapıcı desenini"
case class Foo(lazy next: Foo)
yapmak daha temiz bir yolu var buldum
class Foo(_next: =>Foo) {
lazy val next = _next
}
object Foo {
def apply(next: =>Foo) = new Foo(next)
def unapply(foo: Foo) = Some(foo.next)
}
olduğu add lazy parameters listelenen bir sorun, bu yüzden birgün eklenecektir. Bu arada, kimse yukarıdakilerden daha temiz bir şey biliyor mu?
O kadar içine 'Foo' maç desen çalışırken, sizin' unapply' yöntem tembel olmadığını belirtmekte yarar var başka 'Foo'' next' istediğiniz olmayabilir, hangi değerlendirilmektedir sonuçlanacaktır. –
@BrianMcCutchon Bu iyi bir nokta. Ben tembel yapmak için tek yolu, dolaylı olarak eklemek gibi olurdu, çünkü unapply (foo: Foo) = Some (() => foo.next) '? – Owen
Bu işe yarıyor. Sadece tembel vaka sınıflarım için “unapply” kullanıyorum. Bu durumda, işlevini açıkça çağırmanız gerekir; örneğin, Foo (n) => Foo (doSomething (n())) 'gibi. Bu noktada, 'Need' kullanmak daha iyi olabilir. (Ayrıca, "İhtiyaç" rotasına giderseniz, "Foo" için bir isim-ismi parametresi alan ve bunu "İhtiyaç" haline getiren aşırı yüklü bir kurucu tanımlayabilirsiniz.) –