On 07/15/2014 05:20 AM, Puming wrote:
I found another way to do this, namely first create a class that is
mutable, then cast it to an immutable object before using it.

```d

class A {
     int a;
     B b;
     this(int a, int b)
     {
         this.a = a;
         this.b = new B(b);
     }
}


class B {
     int b;
     this(int b)
     {
         this.b = b;
     }
}

@property immutable(T) freeze(T)(T obj)
{
     return cast(immutable(T))(obj);
}

void main()
{

     immutable c = new A(3, 4).freeze;
     c.b.b = 5; // Error: can only initialize const member b inside
constructor
     writeln(c.b.b)
}
```

But the draw back is that you can't garanteed that the mutable object is
never used.

Also consider: A pure function's return value can implicitly be converted to immutable.

class A
{
    int x;
    int y;

    this (int x) pure
    {
        this. x = x;
    }
}

pure A makeA(int x)    // <-- returns mutable
{
    auto a = new A(x);

    // ...
    // Set a member later on:
    a.y = 42;

    return a;
}

void main()
{
    immutable imm = makeA(1);    // <-- works
}

Ali

Reply via email to