Dün D ile ilgili bir sorunla karşılaştım. const üye işlev içinde this'in ve dolayısıyla üyelerin const olduklarını biliyoruz:
struct S {
int i;
int[char[]] aa;
void foo() const {
static assert(is(typeof(this) == const(S)));
static assert(is(typeof(i) == const(int)));
static assert(is(typeof(aa) == const(int[char[]])));
}
}
void main() {
}
Buraya kadar güzel... Sorun, const eşleme tablosu üyenin .values niteliğini çağırınca ortaya çıkıyor: Her ne kadar aa'nın üyelerinin kopyaları olsalar ve bu yüzden aa'ya hiçbir etkileri olamasa da, .values'un döndürdüğü dizinin elemanları const(int) oluyor:
static assert(is(typeof(aa.values[0]) == const(int)));
Bu gereğinden fazla bir kısıtlama çünkü örneğin döndürülen diziyi sıralayamıyoruz:
auto değerler = aa.values;
değerler.sort; // <-- DERLEME HATASI (Error: can only sort a mutable array)
byValue da işe yaramıyor. İki çözüm var:
- cast ile tür dönüşümü:
auto değerler = cast(int[])aa.values;
- Döngü kullanmak:
int[] değerler;
foreach (değer; aa.byValue) {
değerler ~= değer;
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]