I was using the Haxe3 Release Candidate for well over a month before I realised that the new Map data structures could be created with a nice syntax. The basic gist is this:
var map1 = [ 1=>"one", 2=>"two", 3=>"three" ];
Like Arrays, but you use the “=>” operator to define both the key and the value. And Haxe’s type inference is as strong as ever. Here’s what the compiler picks up:
var map1 = [ 1=>"one", 2=>"two", 3=>"three" ]; $type (map1); // Map<Int, String> var map2 = [ "one"=>1, "two"=>2, "three"=>3 ]; $type (map2); // Map<String, Int> var map3 = [ Date.now() => "Today", Date.now().delta(24*60*60*1000) => "Tomorrow", Date.now().delta(-24*60*60*1000) => "Yesterday" ]; $type (map3); // Map<Date, String> var map4 = [ { name: "Tony Stark" } => "Iron Man", { name: "Peter Parker" } => "Spider Man" ]; $type (map4); // Map<{ name : String }, String> var map5 = [ [1,2] => ["one","two"], [3,4] => ["three","four"], ]; $type (map5); // Map<Array<Int>, Array<String>>
So it’s pretty clever. If for some reason you need to type explicitly to StringMap, IntMap, or ObjectMap, you can:
var stringMap:StringMap<Int> = [ "One" => 1, "Two" => 2 ]; $type(stringMap); // haxe.ds.StringMap<Int> var intMap:IntMap<String> = [ 1 => "One", 2 => "Two" ]; $type(intMap); // haxe.ds.IntMap<String> var objectMap:ObjectMap<{ name:String }, String> = [ { name: "Tony Stark" } => "Iron Man", { name: "Peter Parker" } => "Spider Man" ]; $type(objectMap); // haxe.ds.ObjectMap<{ name : String }, String>
But if you try to do anything too funky with types, the compiler will complain. Haxe likes to keep things strictly typed:
var funkyMap = [ { name: "Tony Stark" } => "Iron Man", { value: "Age" } => 25 ]; // Error: { value : String } has no field name ... // you are a bad person, and your items are not comprehensible // to Haxe's typing system
Finally, Haxe won’t let you do define duplicate keys using this syntax:
var mapWithDuplicates = [ 1 => "One", 2 => "Two", 1 => "uno" ]; // Error: Duplicate Key ... previously defined (somewhere)
If you’re using an object map, it’s only a duplicate if you’re dealing with the exact same object, not a similar one. For example, this is allowed:
var similarObjectKeys:ObjectMap<Array<Int>, String> = [ [0] => "First Array object", [0] => "Second Array object" ]; // Works, you now have 2 items in your map.
But if you use the exact same object, Haxe will pick it up:
var key = [0]; var sameObjectKey = [ key => "First Array object", key => "Second Array object" ]; // Error: Duplicate Key ...
So there you have it. A nice feature that I didn’t see mentioned anywhere else. Thanks Haxe team!
….
Update:
It’s worth mentioning that once you have created your map, you can use array access (“[” and “]”) to read or modify entries in your map.
var map = [ 1=>"one", 2=>"two", 3=>"three" ]; // Reading a value map[1]; "one" var i = 2; map[i]; "two" map[++i]; "three" // Setting a value map[4] = "four"; map[1] = "uno"; map[i] = "THREE"; map; // [ 1=>"uno", 2=>"two", 3=>"THREE", 4=>"four" ]