2015-04-29 18 views
5

Bunu, dilin önceki bir sürümünde yapabileceğime inandım, ve birkaç ay önce yazdığım kod, daha sonra derlenmiş, şimdi derleme değil. Örnek:D'de, kendisinin değişmez olduğu immutable türlerin bir karma olduğunu nasıl bildirebilirim?

immutable(X)[int] myhash; 
myhash[5] = some_immutable_X; //previously fine. 
myhash[5] = some_other_immutable_X; //previously fine also. 

Şimdi ancak dmd başarı olmadan bazı diğer olası sözdizimi İle denediği

Error: cannot modify immutable expression myhash[5] 

ile şikayet (örn (iletmenin X) [int]). Artık karmanın kendisinin değişebilir olduğunu beyan etmenin bir yolu yok gibi görünüyor, ama içerikler değil mi? Bu oldukça yaygın bir kullanım durumu gibi görünüyor: değiştirilmemesi gereken şeylere referansların saklanması için bir veri yapısı. Bunun hakkında bir fikir sahibi olan var mı?

+0

X değeri mi yoksa referans tipi mi (sınıf)? –

+0

Ne işe yaramaz, hem de 2.066.1 ile iyi çalışır ve – Kozzi11

+0

X'den önce bir sınıf (örn. Bir başvuru). –

cevap

3

, o muhtemelen void* ve AA uygulanmasında yerde yanlış döküm kullanımına bir hata (oldu henüz AFAIK). Sen immutable değerlerini mutasyona edemez ve

myHash[5] = value; 

yapmak ve myHash öğeler immutable olduğunda, o zaman AA eleman alır çünkü (bu türler için init değeri olsa bile bir immutable değerini mutasyona çalışıyorsunuz atamadan önce init değeriyle başlatılır ve tür sisteminin öğenin daha önce AA'da olup olmadığını bilmesinin bir yolu yoktur, bu nedenle ilk atama işlemini [] aracılığıyla başlatma ve diğerleri atama olarak kabul edemez). immutable öğelerinden oluşan bir AA'ya sahip olmak istiyorsanız, öğelerin kendileri immutable değil, immutable olan bir öğeye başvurmanız için başka bir dolaylılık düzeyine ihtiyacınız olacak - örneğin, immutable türüne dönüştürülebilir bir işaretçi kullanarak, veya sınıflarla uğraşıyorsanız, std.typecons.Rebindable kullanın (const veya nesnelerine dönüştürülemeyen sınıf başvurunuz olamaz).

2

Bu davranış, 2.061'den önce çalışmadı, 2.061'den 2.066.1'e kadar çalıştı. Ve 2.067'de "düzelt".

diğer bilgiler: Düzgün yapılmış şablonlar geçmediniz beri hiç çalıştıysa github pull ve bug issue

0

o, yerleştirme sırasında değişken için ilişkisel dizi ve eleman hem dökme şöyle oldu Yapacak buldum basit yolu:

cast()myhash[5] = cast()some_immutable_X; 

Ben değişmez tanımları başlatmak benim uygulamalarda böyle bir şey yapmak dış kaynaklardan çalışma zamanında yüklendikten sonra bunları değiştirilebilen varlıklar olarak adlandırın, bu yüzden buraya küçük bir genel örnek koydum: http://dpaste.dzfl.pl/3a4233e5ec82