Ссылка на источник.
Анонимные структуры — используются для объединения данных без явного создания типа. В примере, написанном ниже, создается структура с двумя полями
x и
name, которые получают значения «12» и «foo» соответственно:
1 2 3 4 5 |
class Main { static public function main() { var myStructure = { x: 12, name: "foo"}; } } |
Общие правила синтаксиса:
- Структура заключается в фигурные скобки {};
- Пары ключ-значение разделяются запятой;
- Между ключом и значением ставится двоеточие;
- Значением может быть любое выражение на языке Haxe.
Четвертое правило говорит о том, что структуры могут быть вложенными и сложными, например:
1 2 3 4 5 6 7 8 |
var user = { name : "Nicolas", age : 32, pos : [ { x : 0, y : 0 }, { x : 1, y : -1 } ], }; |
Поля структур могут быть получены, как и классы, используя точку (.), как в примере ниже:
1 2 3 4 |
// получим значение поля "name", которое имеет значение - "Nicolas" user.name; // установим значение поля "age" равным 33 user.age = 33; |
Также для вывода всех полей анонимной структуры, может быть использовано Reflection:
1 2 3 4 5 6 |
var target = { "name": "Butterfly", "version": "0.3" }; var fields = Reflect.fields(target); for (field in fields) { var value = Reflect.getProperty(target, field); trace('${field} => ${value}'); } |
Вот что будет выведено:
name => Butterfly version => 0.3
Стоит отметить, что использование анонимных структур не подрывает, существующую в Haxe, систему типизации. Компилятор гарантирует, что доступны только существующие поля. Это означает что следующая программа не будет скомпилирована.
1 2 3 4 5 6 7 |
class Test { static public function main() { var point = { x: 0.0, y: 12.0 }; // { y : Float, x : Float } не существует поля z point.z; } } |
Полученная ошибка свидетельствует о том, что компилятор знает как был объявлен тип point : это структура с полями x и y типа Float. Поскольку поля z не существует, то доступ будет запрещен. Тип point известен благодаря определению типов. Именно ему мы должны сказать спасибо за то, что у нас нет необходимости каждый раз явно определять типы. Однако, если point является полем, то явное определение типов обязательно:
1 2 3 4 5 |
class Path { var start : { x : Int, y : Int }; var target : { x : Int, y : Int }; var current : { x : Int, y : Int }; } |
Что бы избежать лишнего декларирования типов, особенно для более сложных структур, советуют использовать typedef:
1 2 3 4 5 6 7 |
typedef Point = { x : Int, y : Int } class Path { var start : Point; var target : Point; var current : Point; } |