gpt4 book ai didi

scala - 用Scala定义循环列表的最新方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:19:22 24 4
gpt4 key购买 nike

这是我的尝试:

case class A(val a: A, val b: Int){
override def toString() = b.toString
}

lazy val x: A = A(y, 0)
lazy val y: A = A(z, 1)
lazy val z: A = A(x, 2)

当试图对x做任何事情时,问题就来了;导致x的求值从循环求值开始,经过x,y,z,并在堆栈溢出中结束。有没有一种方法可以指定val a应该延迟计算?

最佳答案

您需要使A.a本身变得懒惰。
您可以通过将其转换为用于初始化惰性字段的“按名称”参数来完成此操作:

class A(a0: => A, val b: Int){
lazy val a = a0
override def toString() = b.toString
}
object A {
def apply( a0: => A, b: Int ) = new A( a0, b )
}

您也可以使用辅助类 Lazy进行相同的操作:
implicit class Lazy[T]( getValue: => T ) extends Proxy {
def apply(): T = value
lazy val value = getValue
def self = value
}

它的优点是您的代码几乎没有什么变化,只是将 a: A更改为 a: Lazy[A]:
case class A(val a: Lazy[A], val b: Int){
override def toString() = b.toString
}

请注意,要访问包裹在 Lazy中的实际值,可以使用 applyvalue(如 x.a()x.a.value一样)

关于scala - 用Scala定义循环列表的最新方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21579272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com