2017-10-10 63 views
0

我發現一個沒有意義的案例。深層複製在工作臺系統中總是失敗

我有以下特點:

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中的地址在同一個索引處是不同的。

所以當我調試這段代碼時,它說結果跨循環完成後設置爲false。

問題是,「檢查不結果」不會使false爲真。

如果我運行工作臺系統,它說以下內容: enter image description here

我不知道爲什麼。在「check not Result」語句中的「Result」之前的「not」應該使其全部檢查爲真,因此它應該在工作臺系統中表示「PASSED」,但是它失敗。

這是爲什麼?

回答

0

您的推理是正確的,寫入的測試查詢應返回False。很可能,只要查詢返回False,系統就會報告FAILED。所以,需要做的是修復查詢本身。

該數組的項目被克隆,因此循環中使用的相等=爲所有元素提供False。要從循環中獲取True,必須使用不同的相等運算符:~。它比較對象而不是引用。在改變之後,查詢給出True並且測試應該通過。

另一種方法是用一個呼叫來代替相等操作到特徵is_deep_equal

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

不同於使用用戶定義的功能is_equal比較對象操作~ - 串中的示例 - is_deep_equal通過遍歷整個對象樹來執行「深度」平等測試。在這種情況下,測試也應該通過。但在實踐中很少使用深層平等。