我已經建立了自己的Yaml Parser,使用haxe中的更多高級內容(例如摘要)來更好地理解每件事物是如何工作的,並且我又打了另一面牆。通過未知或動態類型的字符串ArrayAccess
重要的部分是摘要,abstract YamlMap (StringMap<Either<String, YamlMap>>)
,它充當我的數據的容器。一個「節點」可以是一個字符串或另一個yamlmap,在樹的更深處。
這個YamlMap
有多種獲取數據的方法,如getMap(key):YamlMap
和getString(key):String
,以及一個動態訪問一個,getDynamic(key):Dynamic
。
不幸的是,似乎只有一個@:arrayAccess
將工作是抽象的或我失去了一些東西。它似乎也不能用字符串「動態訪問」一個動態對象,或者至少編譯器阻止我這樣做。
所以,這個工程:data.getMap('test_node').getMap('sub_node1').getString('value2')
但這並不:data['test_node']['sub_node2']['value2']
如果我設置getDynamic
作爲了ArrayAccess,它告訴我sub_node2
應該是一個int。但是,如果我將getMap
和getString
都設置爲arrayAccess,它總是會調用第一個arrayAccess標記的方法。所以它要麼嘗試獲得「價值」(這是一個字符串,但代碼試圖獲得地圖)或不編譯,因爲,我猜,它試圖從字符串訪問字符而不是地圖位置。
所以,我的猜測是,與這個manual entry有關,arrayAccess對任何不抽象的東西都被鎖定爲一個int,因此動態對象拒絕用一個字符串來訪問。
我能想到的一種可能的解決方案是,不是使用動態值,而是返回某種在投射時會「變平」爲正確類型的抽象。會有其他方法在動態地圖上實現字符串化數組訪問嗎?
注:在某種程度上,這是出於好奇,因爲當前方法使用地圖和字符串的不同調用對日常使用來說足夠好。我也知道現有的yaml haxelib,但這是一種學習體驗,因爲它試圖取代有時可能會出現問題的haxelib。
這是YamlMap抽象的Pastebin爲任何感興趣的人。
關於你的'@:arrayAccess'問題,它看起來像每個參數類型只能有一個(忽略返回類型)。所有的訪問器都在'String'參數上運行,所以它們會發生衝突。一般來說,是的,製作「動態字符串訪問對象」是非常棘手的。你的返回類型必須是能夠鏈接訪問者的抽象本身(例如'obj ['a'] ['b']'),但是你怎麼知道你什麼時候在葉子上?我試着編寫一個類似JS的對象。根據我的經驗,它從來不是我想要的。 –