On Tuesday, 6 November 2012 at 18:25:46 UTC, Ali Çehreli wrote:
On 11/06/2012 09:48 AM, PlatisYialos wrote:
On Tuesday, 6 November 2012 at 17:23:41 UTC, PlatisYialos
wrote:
Errmm! Here's a better example, but with the same results:
----------------------------
module test;
void noparens() {
immutable char[char] aMap;
char a = 'a';
immutable char b = 'b';
aMap[a] = b;
}
void withparens() {
immutable(char)[char] aMap;
char a = 'a';
immutable char b = 'b';
aMap[a] = b;
}
-----------------------------
I think it is not surprising why noparens() doesn't work: aMap
is immutable.
withparens() would be expected to work but again, 'aMap[a] = b'
is seen as a mutation of element aMap[a]. If associative arrays
had an insert() function, then we would expect it to work.
Here is a quick solution:
/* I used 'inout' to accept mutable, const, and immutable value
types */
void insert(K, V)(ref immutable(V)[K] aa, K key, inout V value)
{
/* I would like to use the following simpler code:
*
* auto mutable = cast(V[K])aa;
* mutable[key] = value;
*
* It did not work when 'aa' was null. The later
initialization of
* 'mutable ' would affect only 'mutable', not 'aa'.
*/
V[K] * mutable = cast(V[K]*)&aa;
(*mutable)[key] = value;
}
// ...
aMap.insert(a, b);
Ali
Thank you, Ali, for going above and beyond on this one!