在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 */ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |