一般比较与价值比较

Kac*_*hna 4 xquery

为什么XQuery以不同方式处理以下表达式?

  • () = 2 退货false(一般比较)
  • () eq 2 返回一个空序列(值比较)

Jen*_*rat 5

XQuery规范中解释了这种效果.对于XQuery 3,它在章节3.7.1中,Value Comparisons(由我添加的突出显示):

  1. 原子化应用于操作数.此操作的结果称为雾化操作数.
  2. 如果雾化操作数是空序列,则值比较的结果是空序列,并且实现不需要评估其他操作数或应用运算符.但是,实现可以选择评估另一个操作数以确定它是否引发错误.

因此,如果您要比较两个单个元素序列(或标量值,它们等于那些),您将按预期接收true/ false值:

  • 1 eq 2false
  • 2 eq 2true
  • (1) eq 2false
  • (2) eq 2true
  • (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.

  • 也许值得一提的是`()`的*有效布尔值*是false().因此当你执行`if(()eq 2)时,测试将始终导致false(). (2认同)