Bug 9868 – Hash iteration should support counter variable
Status
RESOLVED
Resolution
WONTFIX
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-04-03T12:10:00Z
Last change time
2013-04-07T04:24:03Z
Assigned to
nobody
Creator
andrej.mitrovich
Comments
Comment #0 by andrej.mitrovich — 2013-04-03T12:10:58Z
void main()
{
string[string] hash;
foreach (i, key, val; hash) // ng
{
}
}
I think it would be nice to support this, it allows for things like:
void main()
{
string[string] hash = ["foo":"1", "bar":"2"];
string res;
foreach (i, key, val; hash) // ng
{
if (i) res ~= ", ";
res ~= key ~ " " ~ val;
}
assert(res == "foo 1, bar 2");
}
A map + joiner call would suffice here of course.
Comment #1 by code — 2013-04-06T20:33:15Z
The problem is there is no index in an unsorted map.
But using the known counter from array foreach makes it appear as if there was a relation between i and key/value.
I don't think it's worth the possible confusion.
Comment #2 by andrej.mitrovich — 2013-04-07T04:24:03Z
Fair enough. Here's a library workaround when it's really needed:
----
import std.stdio;
import std.traits;
struct Walk(Hash)
if (isAssociativeArray!Hash)
{
Hash hash;
int opApply(int delegate(size_t idx, KeyType!Hash key, ValueType!Hash val) dg)
{
int result = 0;
size_t idx;
foreach (key, val; hash)
{
result = dg(idx++, key, val);
if (result)
break;
}
return result;
}
}
auto walk(Hash)(Hash hash)
if (isAssociativeArray!Hash)
{
return Walk!Hash(hash);
}
void main()
{
string[string] hash = ["f" : "foo", "b" : "bar"];
foreach (i, key, val; hash.walk)
{
writefln("%s %s %s", i, key, val);
}
}
----