深层复制在 workbench 系统中总是失败

Deep copy always fails in workbench system

我发现了一个没有意义的案例。

我有以下特点:

test_array_deep_copy: BOOLEAN
        local
            imp, old_imp: ARRAY[STRING]
        do
            comment("Test of a deep copy.")
            create {ARRAY[STRING]} imp.make_empty
            imp.force ("Alan", 1)
            imp.force ("Mark", 2)
            imp.force ("Tom", 3)

            old_imp := imp.deep_twin
            imp[2] := "Jim"

            Result :=
                across
                    1 |..| imp.count as j
                all
                    j.item /= 2 implies imp [j.item] = old_imp [j.item]
                end
            check not Result end
        end

既然是深拷贝,那就意味着imp的地址和old_imp是不同的,而且两者的属性也是指不同的地址。

所以,这个"Result"在跨循环之后,应该是false,因为imp和old_imp在同一个index的地址是不同的

所以当我调试这段代码时,它说 Result is set to be false after finishing across loop.

问题是 "check not Result" 无法将假变为真。

如果我运行 workbench 系统,它说如下:

不知道为什么。 "not" before "Result" in "check not Result" statement 应该使整个检查为真,所以它应该在 workbench 系统中说 "PASSED",但它失败了。

这是为什么?

您的推理是正确的,所写的测试查询应该return False。最有可能的是,系统在查询 return 后立即报告 FAILED False。因此,需要做的是修复查询本身。

数组的项目被克隆,因此循环中使用的等式 = 为所有元素提供 False。要从循环中获取 True,必须使用不同的相等运算符:~。它比较对象而不是引用。更改后查询给出 True 并且测试应该通过。

另一种方法是将相等运算符替换为对功能的调用 is_deep_equal:

imp [j.item].is_deep_equal (old_imp [j.item])

不同于使用用户定义的特征is_equal来比较对象的运算符~——示例中的字符串——is_deep_equal通过遍历整个对象树。在这种情况下,测试也应该通过。但是实际中很少使用深度相等。