The program below outputs, as I would expect :
Same Value.
Same Object.
3 : 44E15C 0000
3 : 44E15C 0000
5 : 44E15C 0000
5 : 44E15C 0000

Now what would it mean if it were to output :
Same Value.
3 : 5B536C 59D020
3 : 59CE0C 59CEF0
5 : 5B536C 59D020
5 : 59CE0C 59CEF0
(Output from essentially the same piece of code within a larger project)

Not the same object, but still able to change it with one call.
What is it I don't get?

------
module main;

import std.stdio;
import std.string;

interface I{
        char[] toString();
        int value();
        void value(int v);
}

class C : I{
        private int _value;
        
        this(int v){ _value = v; }
        char[] toString(){ return format(_value); };
        int value(){ return _value; };
        void value(int v){ _value = v; };
}
private I[3][3] arr;

public I getI( int x, int y){ return arr[x][y]; }
public void setI( int x, int y, I i ){ arr[x][y]= i; }

void main(){
        C c = new C(3);
        setI( 0, 0, c );
        setI( 1, 2, c );
        I i1 = null;
        I i2 = null;
        i1 = getI(0,0);
        i2 = getI(1,2);
        
        if( i1 !is null && i2 !is null && i2.value == i1.value ) {
                writefln("Same Value.");
                if( i2 is i1 ) writefln("Same Object.");
                writefln( i2.toString()," : ",i2.__vptr," ",i2.__monitor);
                writefln( i1.toString(), " : ", i1.__vptr," ",i1.__monitor);
                i1.value = 5;
                writefln( i2.toString()," : ",i2.__vptr," ",i2.__monitor);
                writefln( i1.toString(), " : ", i1.__vptr," ",i1.__monitor);
        }
}

Reply via email to