An easier way to learn how to use the Haxe core and related technologies.
Tagged with: Haxe
How do you iterate over all fields of an anonymous structure (possibly behind a typedef
) in Haxe and print out all the values?
The Haxe reflection docs suggest:
The reflection API consists of two classes: - Reflect: A lightweight API which work best on anonymous structures, with limited support for classes. - Type: A more robust API for working with classes and enums.
Reflect
seems promising. From perusing the API docs, I noticed a fields
method. The docs say:
static fields (o:Dynamic):Array
Returns the fields of structure o.
This method is only guaranteed to work on anonymous structures. Refer to Type.getInstanceFields for a function supporting class instances.
That looks promising. Running Reflect.fields({ "name": "Butterfly", "version": "0.3" })
gives me the array ["name", "version"]
back.
Reflect
also includes a getProperty
method, which returns the value of a property. Plug this into a for-loop, like so:
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}');
}
This traces:
name => Butterfly version => 0.3
Also, note that Reflect also contains a field
method which is syntactically similar to getProperty
(same inputs and outputs); the difference is that field
ignores accessors, while getProperty
applies accessors.
Given the choice, in this specific case of anonymous structures, I would use field
instead of getProperty
for readability. This:
for (var field in Reflect.fields(target)) { Reflect.field(...) }
Reads more sensibly than:
for (var field in Reflect.fields(target)) { Reflect.getProperty(...) }
If you apply this on something other than an anonymous structure, you should probably opt for getProperty
instead.