problems with Rebindable

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat May 21 06:34:32 PDT 2016


On 05/21/2016 02:17 PM, chmike wrote:
> On Saturday, 21 May 2016 at 10:42:13 UTC, chmike wrote:
>> source/app.d(23,27): Error: cannot implicitly convert expression (one)
>> of type immutable(Obj) to app.Info
>
> Apparently Rebindable doesn't support polymorphism. This is hopefully
> fixable.

No, the difference in mutability is the problem. Can't implicitly 
convert class objects from immutable to mutable.

[...]
> A Rebindable variable can't be used as a switch argument. This would
> require a change to the language rules.

Class objects in general can't be used as switch arguments.

> However, the static immutable
> object Infos.one can be used as a case argument.

How do you figure that? I get 'Error: case must be a string or an 
integral constant, not Obj("I'm one")'.

> The conclusion is that Rebindable doesn't cover the needs of a mutable
> object reference.

I don't follow. Seems to me that the limitations you see here are in 
place for ordinary class objects as well.

> In the flyweight pattern we only need to compare object addresses and we
> also want to use the lazy pattern to instantiate the immutable instances.

It may be possible to get pointers from the objects and switch over 
those pointers. Can't use class objects directly, because equality is 
defined by opEquals which is virtual. And a switch doesn't make sense if 
opEquals needs to be called.

Also, I'm afraid you're going to have a bad time when trying to get lazy 
initialization + immutable.


More information about the Digitalmars-d-learn mailing list