Thi*_*ilo 4 perl lazy-evaluation
我有一个变量,我需要传递给子程序.子程序很可能不需要这个变量,并且为变量提供值很昂贵.是否可以创建一个"延迟加载"对象,只有在实际使用时才会对其进行评估?我无法更改子程序本身,因此它仍然看起来像调用者的普通Perl标量.
你会想看看Data :: Lazy和Scalar :: Defer. 更新:还有Data :: Thunk和Scalar :: Lazy.
我自己没有尝试过这些,但我不确定它们是否适用于某个物体.为此,您可以尝试使用Moose类,将实际对象保存在对象提供的所有方法的惰性属性中handles
.(isa
但是,如果子例程进行检查,这将无法工作,除非它isa
作为方法调用,在这种情况下,您可以在类中覆盖它.)
Data::Thunk
这是我所知道的最透明,最健壮的方式.
但是,我不是它的忠实粉丝,或者试图将自己隐藏起来的任何其他类似的模块或技术.我更喜欢更明确的东西,比如让代码使用难以计算的值只需调用函数来检索它.这样您就不需要预先计算您的值,您的意图更清晰可见,并且您还可以有各种选项来避免重新计算值,例如词法闭包,perl的状态变量或类似的模块Memoize
.