加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在scala中做一个懒惰变量

发布时间:2020-12-16 09:00:17 所属栏目:安全 来源:网络整理
导读:Scala不允许创建laze vars,只允许lazy vals.有道理. 但是我已经碰到了用例,我希望能有类似的功能.我需要一个懒惰的变量持有者.可以为其分配应该由耗时算法计算的值.但它可能会在以后重新分配给另一个值,我不想再调用第一个值计算. 假设有一些魔术var定义的示
Scala不允许创建laze vars,只允许lazy vals.有道理.

但是我已经碰到了用例,我希望能有类似的功能.我需要一个懒惰的变量持有者.可以为其分配应该由耗时算法计算的值.但它可能会在以后重新分配给另一个值,我不想再调用第一个值计算.

假设有一些魔术var定义的示例

lazy var value : Int = _
val calc1 : () => Int = ... // some calculation
val calc2 : () => Int = ... // other calculation
value = calc1
value = calc2
val result : Int = value + 1

这段代码应该只调用calc2(),而不是calc1

我知道如何使用隐式转换和特殊容器类编写此容器.我很好奇是否有任何嵌入式scala功能不需要我编写不必要的代码

解决方法

这有效:

var value: () => Int = _
val calc1: () => Int = () => { println("calc1"); 47 }
val calc2: () => Int = () => { println("calc2"); 11 }
value = calc1
value = calc2
var result = value + 1 /* prints "calc2" */

implicit def invokeUnitToInt(f: () => Int): Int = f()

由于它广泛适用,因此隐含了我的担忧,这可能会导致意外的应用程序或编译器错误的模糊含义.

另一种解决方案是使用带有setter的包装器对象和为您实现惰性行为的getter方法:

lazy val calc3 = { println("calc3"); 3 }
lazy val calc4 = { println("calc4"); 4 }

class LazyVar[A] {
  private var f: () => A = _
  def value: A = f() /* getter */
  def value_=(f: => A) = this.f = () => f /* setter */
}

var lv = new LazyVar[Int]
lv.value = calc3
lv.value = calc4
var result = lv.value + 1 /* prints "calc4 */

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读