Modify

Opened 9 months ago

Last modified 2 months ago

#3969 new Feature Request

Map Initializer List

Reported by: anonymous Owned by:
Milestone: Component: AutoIt
Version: Severity: None
Keywords: Map, Initializer List Cc:

Description (last modified by mLipok)

; For Arrays, we can use
Global $a = [1, 2, 3]
; or
Global $a[] = [1, 2, 3]
; or
Global $a[3] = [1, 2, 3]

; But if we create a Map, it is always empty, and there is no good way to initialize Maps. So here is a suggestion:

Global $a["key1", "key2", "key3"] = [1, 2, 3]

; is the same as

Global $a[]
$a["key1"] = 1
$a["key2"] = 2
$a["key3"] = 3

; I'm sure we do not "need" this feature, but it would be nice to have. (the same argument could be made for Array-Initialization with initializer list... we do not "need" it, but it is nice that it exists)

Attachments (0)

Change History (8)

comment:1 Changed 9 months ago by anonymous

; Addition: If the right side is missing, the map is initialized with empty strings for every key.

Global $a["key1", ..., "keyN"]
If MapExists($a, "key1") -> True.

; This enables compact and easy to use string lookup-tables.

comment:2 Changed 8 months ago by mLipok

  • Description modified (diff)

comment:3 Changed 3 months ago by Andreik

I use maps very often and I would like to see a map initializer but I don't know if it's possible without introducing a new operator, a keyword or something. It will be a total confusion. Take this as example:

Global $Var[1] = [5]

Right now this is a valid syntax to initialize an array with one element but it could be as well a map with the key name 1 (according to proposed syntax).

comment:4 Changed 3 months ago by vanowm <fromautoitscript.comid240211@…>

Another reasoning to have such feature is ability create constant maps. Currently we have to create a temporary map, populate it, then copy it to a constant.:

; create temporary map
Local $a[]
$a["key1"] = 1
$a["key2"] = 2
$a["key3"] = 3

; copy to a constant
Global Const $b = $a
; clean up
$a = null

comment:5 Changed 2 months ago by anonymous

Please consider this proposition of a good non-ambiguous syntax:

Dim $map["prime": 101,  -1: "-one",  $hMyGUI: $aSomeAssociatedData]

-- or (which can be an allowed alternative, just like arrays have two ways to define 'em) --

Dim $map[] = ["prime": 101,  -1: "-one",  $hMyGUI: $aSomeAssociatedData]

comment:6 Changed 2 months ago by anonymous

also

Dim $map = ["prime": 101,  -1: "-one",  $hMyGUI: $vSomeAssosiatedData]

comment:7 Changed 2 months ago by Andreik

The syntax might work but the examples are bad since AutoIt maps are designed to work with integers and strings, not with handles or other data types as keys.

comment:8 Changed 2 months ago by anonymous

Andreik, that only means that the maps are poorly designed -- and NOTHING else. It's not necessarily anyone's fault/guilt; after all, obtaining perfection(or even just good-enough-ness) is a progress (and i hasten to say that the maps in their current form are NOT good-enough: to be blunt, they're literally a worser version of Scripting.Dictionary -- that's it.) We're all now got involved(if only in spirit) in making maps progress further making them the best they can be(in bed AutoIt); now lets be optimistic and hope/believe it will be crowned with a resounding success!! :]

Guidelines for posting comments:

  • You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
  • In-depth discussions should take place on the forum.

For more information see the full version of the ticket guidelines here.

Add Comment

Modify Ticket

Action
as new The ticket will remain with no owner.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.