Ссылка на источник.
Анонимные структуры — используются для объединения данных без явного создания типа. В примере, написанном ниже, создается структура с двумя полями
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; } |
- e-olymp 2166: Анаграммы - 02.06.2017
- e-olymp 7365. Молоко и пирожок - 20.05.2017
- A710 - 17.05.2017
Пока лучшее из того, что я видел. Но…
— Укажите номер 2.5 в заголовке и сделйте 2-5 постоянной ссылкой.
— Текст «haxe.org/manual» излишний. Уж лучше сделать слово «источник» гиперссылкой.
— Сделайте правильные отступы в коде.
— Слово «разделяет» с «от» не употребляется.
— Если Вы пишите «Четвертое правило», то список должен быть нумерованным (ordered list).
— Разберитесь с «нельзя нарушить» = невозможно, а «нельзя нарушать » = запрещающее правило.
— Используйте crayon с опцией inline, если упоминаете что-либо из вашего кода (переменные, функции и т.п.).
— Добавьте свою программу с анонимными структурами. Либо прямо здесь, либо ссылкой на другую Вашу (или чужую) работу на этом сайте, где они есть.
— сделайте гиперссылки на другие страницы этого сайта по аналогии с первоисточником.
Все замечания постаралась исправить.
— Мне все еще не нравится. Смысл должен быть такой: «Стоит отметить, что использование анонимных структур не подрывает систему типизации. Компилятор гарантирует, что доступны будут только существующие поля. Т.е. следующая программа не будет скомпилирована.
— Сделайте, пожалуйста, ссылки на наш сайт, а не на сайт с документацией на английском. Даже если нужной статьи пока нет, можно догадаться как она будет называться. Например, относительная ссылка на 3.6 Type Inference будет выглядеть как «3-6».
Спасибо за замечания, я всё исправила.