XQuery规范中解释了这种效果.对于XQuery 3,它在章节3.7.1中,Value Comparisons(由我添加的突出显示):
- 原子化应用于操作数.此操作的结果称为雾化操作数.
- 如果雾化操作数是空序列,则值比较的结果是空序列,并且实现不需要评估其他操作数或应用运算符.但是,实现可以选择评估另一个操作数以确定它是否引发错误.
因此,如果您要比较两个单个元素序列(或标量值,它们等于那些),您将按预期接收true/ false值:
1 eq 2 是 false2 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.
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |