为什么XQuery以不同的方式处理以下表达式?
() = 2
返回false
(一般比较)() eq 2
返回空序列(值比较)答案 0 :(得分:5)
XQuery规范中解释了这种效果。对于XQuery 3,它在章节3.7.1, Value Comparisons中(由我添加突出显示):
- 将雾化应用于操作数。此操作的结果称为雾化操作数。
- 如果雾化操作数是空序列,则值比较的结果是空序列,并且实现不需要评估其他操作数或应用运算符。但是,实现可以选择评估另一个操作数,以确定它是否引发错误。
醇>
因此,如果您要比较两个单个元素序列(或标量值,它们等于那些),您将按预期收到true
/ false
值:
1 eq 2
是false
2 eq 2
是true
(1) eq 2
是false
(2) eq 2
是true
(2) eq (2)
是true
但是,如果一个或两个操作数都是空列表,您将收到空列表:
() eq 2
是()
2 eq ()
是()
() eq ()
是()
此行为允许您传递空序列,这可以在此处用作一种null
值。正如@adamretter在评论中添加的那样,空序列()
的有效布尔值为false
,所以即使你运行if ( () eq 2) ...
之类的东西,你也不会发现任何令人惊讶的事情。
如果任何操作数包含多个元素的列表,则表示类型错误。
常规比较,$sequence1 = $sequence2
测试$sequence1
中的任何元素在$sequence2
中是否具有相等的元素。由于这在语义上已经支持任意长度的序列,因此不必应用雾化。
差异来自运营商强加的要求'签名。如果以基于集合的方式比较任意长度的序列,则没有理由为空序列包含任何特殊情况 - 如果包含空序列,则根据定义自动比较false
。
对于比较单值的运算符,必须考虑传递空序列的情况;决定不是引发错误,而是返回一个等于false
的值:空序列。这允许使用空序列作为一种null
值,当值未知时;任何与未知值相比的东西都不能是true
,但绝不能(必然)是假的。如果需要,可以检查empty(...)
结果,如果是,则要比较的值之一是未知的;否则他们就会变得与众不同。在Java和其他语言中,null
值将用于实现类似的结果,在Haskell中有Data.Maybe
。