On 08.01.2012 18:54, Ben Davis wrote:
Hi,
Is there a reason 'ref' is disallowed for local variables? I want to
write something like:
MapTile[] map; // It's a struct
ref MapTile tile=map[y*w+x];
tile.id=something;
tile.isWall=true;
My actual case is more complicated, so inlining the expression
everywhere would be messy. I can't use 'with' because I sometimes pass
'tile' to a function (which also takes it as a ref). I don't want to
make it a class since the array is quite big and that would be a lot of
extra overhead. For now I'm using pointers, but this is forcing me to
insert & or * operators sometimes, and it also reduces the temptation to
use 'ref' in the places where it IS allowed, since it's inconsistent.
I hope it's not a stupid question - it's my first one - but I couldn't
find an answer anywhere. I like most of what I've seen of D so far, and
I'm very glad to be able to leave C and C++ (mostly) behind!
Thanks,
Ben :)
I got something working, but only when using templates. Take the
following with a grain of salt as I'm a newbie myself.
struct MapTile {
string id;
}
enum w = 80, h = 25;
MapTile[w*h] map;
ref MapTile getTile(int x, int y) {
return map[y*w+x];
}
void f(T)(ref T tile) {
tile.id = "f()";
}
void g(ref MapTile tile) {
tile.id = "g()";
}
void main() {
// You can use auto ref return to set values directly
getTile(10,10).id = "a";
assert(getTile(10,10).id == "a");
// And using templated ref arguments, you can pass by reference
// note that I need to take the reference even when
// using auto ref return
auto tile = &getTile(1,1);
f(tile);
assert(tile.id == "f()");
// But you'll need a dereference if not using a template
g(*tile);
assert(tile.id == "g()");
assert(getTile(1,1).id == "g()");
}