how to manage the list of immutable objects

2015-07-14 Thread aki via Digitalmars-d-learn

I like to create immutable object
which is identified by name as it's key.
And also need get() to look up named object
which is already created.

class Foo {
static immutable(Foo)[string] map;
string name;
// and other attributes here...

this(string name) immutable {
this.name = name;
map[name] = this;
}
static immutable(Foo) get(string name) {
return map[name];
}
}

But this code causes error:
test.d(8): Error: cannot modify immutable expression map[name]

How can I declare the map so that it contains
immutable object Foo, but the reference to Foo is mutable?
Anyway the goal is to provide get() function.
Tell me how to implement get().

Aki.


Re: how to manage the list of immutable objects

2015-07-14 Thread Andrea Fontana via Digitalmars-d-learn

On Tuesday, 14 July 2015 at 10:09:56 UTC, aki wrote:

I like to create immutable object
which is identified by name as it's key.
And also need get() to look up named object
which is already created.

class Foo {
static immutable(Foo)[string] map;
string name;
// and other attributes here...

this(string name) immutable {
this.name = name;
map[name] = this;
}
static immutable(Foo) get(string name) {
return map[name];
}
}

But this code causes error:
test.d(8): Error: cannot modify immutable expression map[name]

How can I declare the map so that it contains
immutable object Foo, but the reference to Foo is mutable?
Anyway the goal is to provide get() function.
Tell me how to implement get().

Aki.


Trying on http://dpaste.dzfl.pl/ I don't see that error.
Maybe you mean "const" and not "immutable" ?

Andrea


Re: how to manage the list of immutable objects

2015-07-14 Thread aki via Digitalmars-d-learn

On Tuesday, 14 July 2015 at 10:46:42 UTC, Andrea Fontana wrote:

Trying on http://dpaste.dzfl.pl/ I don't see that error.
Maybe you mean "const" and not "immutable" ?

Andrea


I used:
DMD32 D Compiler v2.067.1 on Windows8
I believe there are no typo because it is copy-pasted.
I noticed I can use cast.
cast()(map[name]) = cast()this;
Are there any better solution?

Aki.



Re: how to manage the list of immutable objects

2015-07-14 Thread Steven Schveighoffer via Digitalmars-d-learn

On 7/14/15 7:12 AM, aki wrote:

On Tuesday, 14 July 2015 at 10:46:42 UTC, Andrea Fontana wrote:

Trying on http://dpaste.dzfl.pl/ I don't see that error.
Maybe you mean "const" and not "immutable" ?


Wow, that needs updating. Latest version is 2.065 from February 2014, 
and the git version is from March 2013!




I used:
DMD32 D Compiler v2.067.1 on Windows8
I believe there are no typo because it is copy-pasted.
I noticed I can use cast.
cast()(map[name]) = cast()this;
Are there any better solution?


Cast is not a good idea. What you need is a rebindable class reference 
to an immutable class. For that, the official recommendation is to use 
std.typecons.Rebindable. Perhaps it works for you:


static Rebindable!(immutable(Foo))[string] map

-Steve


Re: how to manage the list of immutable objects

2015-07-14 Thread aki via Digitalmars-d-learn
On Tuesday, 14 July 2015 at 11:44:34 UTC, Steven Schveighoffer 
wrote:

static Rebindable!(immutable(Foo))[string] map

-Steve


It all works. And I learned something from
the source code of Rebindable.
Thank you.

Aki.