digitalmars.D.learn - foreach and changing the aggregate's values?
- AEon (46/46) Mar 26 2005 Just double checking I am not doing something bad, without knowing it:
- Ben Hinkle (5/10) Mar 26 2005 What you are doing should be ok but it seems cleaner to use inout:
- AEon (5/18) Mar 26 2005 ahh... I had been wondering when I would ever need inout... so this way
Just double checking I am not doing something bad, without knowing it: char[][] glb.Ban; glb.Ban[0] = "player\""; glb.Ban[1] = "UnnamedPlayer\""; glb.Ban[2] = "Padawan\""; I did not actually init glb.Ban this way, but the data it contains is correct: <code> // ***The aggregate itself must not be resized, reallocated, free'd, // reassigned or destructed while the foreach is iterating over the // elements. foreach(int i, char[] ban; glb.Ban) { int joker = 0; if( ban[0] == '\"' ) // "abc, remove first " { joker += 1; glb.Ban[i] = ban[1..$].dup; } if( glb.Ban[i][$-1] == '\"' ) // abc", remove last " { joker += 2; glb.Ban[i] = glb.Ban[i][0..$-1].dup; } glb.banJoker[i] = joker; // Remember the compare mode } </code> Now from first reading the documentation, see *** comment, I should bot be able to change "aggregate itself". If I understand it correctly though I am not actually changing the aggregat glb.Ban itself, but the values of the aggregat, e.g. glb.Ban[i]. So this is the reason the above works? The documentation has this example: <code> int[] a; int[] b; foreach (int i; a) { a = null; // error a.length += 10; // error a = b; // error a[i] = 3; // ***added, is not mentioned, but should work?! } a = null; // ok </code> AEon
Mar 26 2005
Now from first reading the documentation, see *** comment, I should not be able to change "aggregate itself". If I understand it correctly though I am not actually changing the aggregat glb.Ban itself, but the values of the aggregat, e.g. glb.Ban[i]. So this is the reason the above works?What you are doing should be ok but it seems cleaner to use inout: foreach(inout char[] ban; glb.Ban) { ...modify ban if needed ... } instead of using the index i into the original glb.Ban.
Mar 26 2005
Ben Hinkle wrote:ahh... I had been wondering when I would ever need inout... so this way I can change the current ban, and thus change the original glb.Ban[]. Indeed that would be neater to do. AEonNow from first reading the documentation, see *** comment, I should not be able to change "aggregate itself". If I understand it correctly though I am not actually changing the aggregat glb.Ban itself, but the values of the aggregat, e.g. glb.Ban[i]. So this is the reason the above works?What you are doing should be ok but it seems cleaner to use inout: foreach(inout char[] ban; glb.Ban) { ...modify ban if needed ... } instead of using the index i into the original glb.Ban.
Mar 26 2005