On 11/15/2012 07:43 PM, Kenji Hara wrote:

> This code works with dmd git head (and might work with dmd 2.060).

Yes, it works with dmd 2.060 as well.

> immutable(Foo) makeFoo() pure

I would like to repeate an earlier question: Does makeFoo() want that the returned object be immutable? If so, the previous signature is required.

However, if makeFoo() does not care, then it would be better if it returned a mutable Foo:

Foo makeFoo() pure

In that case the callers could decide whether they wanted to have the returned object as mutable or immutable:

    immutable ifoo = makeFoo();
    auto mfoo = makeFoo();

The above works because makeFoo() is pure.

If makeFoo() were not pure, and in general, Foo may need to provide an .idup member function:

import std.conv;
import std.exception;

struct Foo
{
    int a, b;
    string[string] aa;
    int[] slice;

    immutable(Foo) idup() pure const @property
    {
        auto copy = to!(string[string])(aa);
        immutable iaa = assumeUnique(copy);
        return immutable(Foo)(a, b, iaa, slice.idup);
    }
}

void main()
{
    auto foo = Foo(42, 43, [ "a" : "hello", "b" : "world" ], [ 42 ]);
    immutable ifoo = foo.idup;
}

Ali

Reply via email to