Haxe的anonymous structures只不過是無類型的,有組織的數據集合。它們的結構一旦設置就不可改變,只有屬性值可以修改。數組訪問(括號表示法)未在匿名結構中定義 - 而是使用點表示法。
由於匿名結構的無類型(動態)性質,編譯爲靜態目標時它們可以有一個negative impact on performance。
建議使用typedefs和typedef extensions組織和鍵入匿名結構。這確保了類型安全,並幫助編譯服務器隨時隨地處理任何輸入錯誤。
要回到關鍵點,您嘗試執行的操作最好通過使用maps和typedefs來實現。地圖可讓您存儲正確的鍵值對(通過方法和括號表示法),而typedefs讓您鍵入數據結構,確保類型安全。
考慮到這一點,您的代碼段可以被重新創建如下:
class Test {
static var data : Map<String, Room> = new Map<String, Room>();
static function main() {
data["R100"] = { monsterCount: 5 };
data["R200"] = { monsterCount: 10 };
trace(data["R100"].monsterCount);
trace(data["R200"].monsterCount);
}
}
typedef Room = {
var monsterCount : Int;
}
Room
現在是由{ "monsterCount": (Int) }
數據結構所描述的類型,並且被映射到字符串鍵,其表示房間ID。
Map API允許您設置和刪除地圖中的鍵值對,以及迭代鍵/值等等。請務必查看API docs瞭解更多信息。通過lordkryss提供
編輯(2016年7月26日)
答案是完全有效的。不過,有兩個主要原因,我沒有提出reflection。
- 反射是一種運行時功能,它的使用會不必要地使您的代碼複雜化,並且不提供所需的語法。
- 反射在不同的目標上可能是昂貴和不可預測的。
一般來說,你應該用車費反射動態更好,而不是靜態目標。在開發您的項目並確定您的目標平臺將是什麼時請記住這一點。
我建議考慮產生的來源,以更好地瞭解反射的影響。您可以使用官方的try.haxe.org沙盒來查看Haxe 3.2.0生成的JavaScript源代碼。還有unofficial sandbox,它也讓你看到Haxe 3.3.0-rc.1生成的JavaScript源代碼。
個人而言,我不認爲反射是一個可接受的解決方案,您的問題。我發現你的問題是找到合適的數據結構來表示你的數據。反射有其用處,但我不會在這種情況下推薦它。
謝謝你們,所有這些答案都是偉大的。我現在已經和LordKryss一起回答了,只是因爲它是最容易實現的,但是當我運行它時,會回頭看看正確的結構。謝謝大家 – Ferrari177