續上文《木蘭語言的引用相關功能與問題新發現》,對重複引用的各種方式作了更多測試,基於當前理解作一小結。
簡言之,由於每次引用模組都對其執行(exec)一次,在多處引用同一模組的情況下,引用順序和模組位置不同會導致不同結果。暫沒想到此種行為的應用場景。
比如在 TypeDef 模組中定義一個類:
type Type1 { ; }
在同層目錄下 Instance1 模組中宣告一個個體:
using * in TypeDefinstance1 = Type1()
那麼在另一模組中,先後引用 TypeDef 和 Instance1,如下的 isa 判斷(對應 python 的 isinstance)返回 true,意料之中:
using * in TypeDefusing * in Instance1print(isa(instance1, Type1))
但是以下的三種情況,全都返回 false:
情況 1:using * in Instance1using * in TypeDefprint(isa(instance1, Type1))
情況 2:
using TypeDefusing Instance1print(isa(Instance1.instance1, TypeDef.Type1))
情況 3:
using Instance1using TypeDefprint(isa(Instance1.instance1, TypeDef.Type1))
而如果 TypeDef 和 Instance1 在包內,行為又略有不同。如下返回 true(注意 TypeDef 在 Instance1 後引用)
using * in test.Instance1using * in test.TypeDefprint(isa(instance1, Type1))
以下的三種情況,全都返回 false:
情況 4:using * in test.TypeDefusing * in test.Instance1print(isa(instance1, Type1))
情況 5:using * in test.TypeDefusing test.Instance1print(isa(test.Instance1.instance1, Type1))
情況 6:
using * in test.Instance1using test.TypeDefprint(isa(instance1, test.TypeDef.Type1))
測試用例 集結在此。
為規避,在應用中儘量保持“樹式引用”,即一個模組只直接引用一次。
最新評論