digitalmars.D.learn - foreach with classes like associative array?
- Matt Soucy (10/10) Jan 20 2012 So I was messing around with some code I've been writing today, and I
- bearophile (4/6) Jan 20 2012 opApply sounds like the solution for your problem, if you don't need to ...
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (41/51) Jan 20 2012 I have a chapter for this but it hasn't been translated yet:
- Steven Schveighoffer (18/27) Jan 24 2012 From your question, I'm not sure what you are looking for. It seems yo...
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
Jan 20 2012
Matt Soucy: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?opApply sounds like the solution for your problem, if you don't need to define a Range. You are allowed to define two or more opApply with different type/number of arguments. Bye, bearophile
Jan 20 2012
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 SoucyI 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
Jan 20 2012
On Fri, 20 Jan 2012 19:53:33 -0500, Matt Soucy <msoucy csh.rit.edu> 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,From your question, I'm not sure what you are looking for. It seems you are aware of opApply, but have dismissed it as being usable. If it helps, here is the reference for how foreach works on various things: http://www.d-programming-language.org/statement.html#ForeachStatement Could it be that you want to do this? class C { int x; int y; } C c; foreach(string membername, value; c) {...} // iterate with "x" and "y" as membername ??? I think there is a way to do it with tupleof, but I'm not sure if you can get the member names during iteration. -Steve
Jan 24 2012