On Sun, 08 Jan 2012 18:54:13 +0100, Ben Davis <[email protected]> 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 :)

Quick hack:

struct Ref( T ) {
        private:
        T* data;
        public:
        this( ref T value ) {
                data = &value;
        }
        
        ref inout(T) get( ) inout {
                return *data;
        }
        
        alias get this;
}

Ref!T byRef( T )( ref T value ) {
        return Ref!T( value );
}

unittest {
        int a = 3;
        Ref!int b = a;
        b = 4;
        assert( a == 4 );
        
        auto c = byRef( a );
        c = 5;
        assert( a == 5 );
        assert( b == 5 );
}

Reply via email to