方法一
declare function foo($bar){
variable $x := some_fn($bar/yada/yada);
variable $y := other_fn($x);
$y
};
方法 2(FLOWR)
declare function foo($bar){
let $x := some_fn($bar/yada/yada)
let $y := other_fn($x)
return $y
};
不同的语法,相同的结果;从处理器的角度来看,有什么不同?有什么理由优先选择一种方法而不是另一种方法?为了便于阅读,我更喜欢 FLOWR。
最佳答案
第一种方法(使用变量
)依赖于非标准扩展。至少在 Zorba 上,这被称为 Zorba Scripting Extension (滚动到底部,标题“脚本”)这向 XQuery 添加了副作用命令式编程结构。默认情况下,此扩展在 Zorba 中处于启用状态,但 can be turned off .
我找不到此扩展的规范。更令人困惑的是,有一个名为 XQuery Scripting Extension 的 W3C XQuery 扩展。它添加了相同的功能,但使用了不同的语法,而 Zorba 没有实现此 W3C 扩展。 W3C 语法为declare $x ...;
(而不是 block 顶部的变量 $x ...;
。
无论如何,以下是两个代码片段之间的差异:
- 您的
变量
方法是非标准的,并且可能是 Zorba 特定的;您的 FLWOR 是普通的 XQuery 1.0。 variable
方法具有副作用:$x
和$y
位于整个 block 的范围内,并且可以重新定义随时分配。使用 FLWOR 方法,每个let
绑定(bind)仅对以下 FLWOR 子句可见。- 我不知道这样一个简单的示例是否会对性能产生任何影响。一般来说,有时可变性和副作用更快,但编译器通常更难优化此类代码(并且它们可能能够比手写的可变代码更好地优化不可变的纯代码)。但这完全取决于 Zorba 在幕后所做的事情。
我不会使用变量
,因为它是非标准的,而且我更喜欢基于表达式的非命令性代码的可预测性。对我来说,使 XQuery 命令式听起来像是一个错误。
关于syntax - XQuery 函数 : variable and expression vs FLOWR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25670248/