On 01/20/2012 04:53 PM, Matt Soucy wrote:
So I was messing around with some code I've been writing today, and I
wanted to use a foreach for something, as if it were an associative
array. The problem is, I can't find any information on how to do that.
I can't use something like "alias this", because the class I'm writing
acts as a wrapper that lets me use string offsets for something that's
not string-indexed by default.
I don't see any sort of opApply or similar to do this, and the foreach
section of dlang.org doesn't help. Is there a way to do it?
Thank you,
-Matt Soucy

I have a chapter for this but it hasn't been translated yet:

  http://ddili.org/ders/d/foreach_opapply.html

Translating from there, when there is the following piece of code:

    // What the programmer wrote:
    foreach (/* loop variables */; object) {
        // ... operations ...
    }

The compiler uses the following behind the scenes:

    // What the compiler uses:
    object.opApply(delegate int(/* loop variables */) {
        // ... operations ...
        return termination_code;
    });

You must terminate your loop if termination_code is non-zero. So all you need to do is to write an opApply overload that matches the loop variables:

class C
{
    int[3] keys;
    int[3] values;

    int opApply(int delegate(ref int, ref int) operations) const
    {
        int termination_code;

        for (size_t i = 0; i != keys.length; ++i) {
            termination_code = operations(keys[i], values[i]);
            if (termination_code) {
                break;
            }
        }

        return termination_code;
    }
}

import std.stdio;

void main()
{
    auto c = new C;

    foreach(key, value; c) {
        writefln("%s:%s", key, value);
    }
}

Ali

Reply via email to