深层复制在 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
通过遍历整个对象树。在这种情况下,测试也应该通过。但是实际中很少使用深度相等。
我发现了一个没有意义的案例。
我有以下特点:
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
通过遍历整个对象树。在这种情况下,测试也应该通过。但是实际中很少使用深度相等。