我有一个XQuery库模块,包括一些不带参数的函数。 我考虑将这些函数重写为变量,以便更快地访问它们。
然而,其中一些内容是计算上昂贵的表达方式。作为函数,它们显然只有在被调用时才会被评估。但作为变量,我不确定在导入库模块时是否会自动评估它们。
只有一些导入此模块的查询才会使用这些变量,并证明其评估的合理性。对于不使用变量的其他人来说,所述评估将是不必要的开销。
如果导入的变量被懒惰地评估,那就不会有问题:我可以在任何查询上导入库模块,知道只有在主模块实际使用时才会评估这些昂贵的变量。
我知道这只是写prefix:myImportedFunction()
与$prefix:myImportedVariable
的问题,但这是一个我想消除的不确定性。
我认为这种行为取决于实现。我对BaseX和Saxon-HE的行为特别感兴趣。他们懒惰地评估导入的变量吗?
答案 0 :(得分:2)
Saxon通常会对全局变量使用延迟评估。例外情况是启用了运行时跟踪(如果在IDE中进行调试,则可以执行此操作);然后切换到急切的评估,使调试更容易处理。
答案 1 :(得分:2)
在BaseX中,如果在执行的代码中引用了这些变量,那么这些变量将被优化(并因此可能被预先评估)。例如,在以下表达式中,不会评估$ v:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:bottom="@dimen/pointing_arrow_size">
<shape android:shape="rectangle" >
<solid android:color="#FFFF00" />
</shape>
</item>
<item android:height="@dimen/pointing_arrow_size"
android:gravity="bottom">
<shape android:shape="rectangle" >
<solid android:color="#00000000" />
</shape>
</item>
</layer-list>
选择访问变量的预评估是因为它在BaseX中启用了许多后续优化。但是,可以通过添加Q{http://basex.org}lazy
annotation:
<klogi.com.viewpagerwithdifferentmenu.CustomTabLayout.TabLayoutWithArrow
android:id="@+id/tabLayout"
android:background="@drawable/tab_layout_background"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>