深层复制始终在工作台系统中失败

时间:2017-10-10 20:54:44

标签: eiffel

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

我有以下功能:

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的地址不同,以及它们两者中的属性也指不同的地址。

所以,这"结果"在循环之后,它应该是假的,因为在相同索引处的imp和old_imp中的地址是不同的。

因此,当我调试此代码时,它表示在完成循环后,Result被设置为false。

问题是"检查不结果"并不是假的。

如果我运行工作台系统,它会说: enter image description here

我不知道为什么。 "不"之前"结果"在"检查不结果"声明应该使整个检查成立,所以它应该说" PASSED"在workbench系统中,但它失败了。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

您的推理是正确的,所写的测试查询应返回False。最有可能的是,只要查询返回FAILED,系统就会报告False。因此,需要做的是修复查询本身。

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

另一种方法是通过调用功能is_deep_equal来替换相等运算符:

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

与使用用户定义的特性~来比较对象的运算符is_equal不同 - 示例中的字符串 - is_deep_equal通过遍历整个对象树来执行“深度”相等性测试。在这种情况下,测试也应该通过。但在实践中很少使用深度平等。