首頁>技術>

續上文《木蘭語言的引用相關功能與問題新發現》,對重複引用的各種方式作了更多測試,基於當前理解作一小結。

簡言之,由於每次引用模組都對其執行(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)) 

測試用例 集結在此。

為規避,在應用中儘量保持“樹式引用”,即一個模組只直接引用一次。

13
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • CSS樣式初始化