Ben Derleme zamanı değerlendirme
enum chars = digits ~ uppercase;
dize derleme sırasında birleştirilmiş olacak yazarsam? Yapacağını farz ediyorum. Bir dize ile birebir değiştirin veya CTFE fonksiyonu herhangi önemli performans farklılıkları ölçemez Eğer (hatta yüz milyon kere çağırarak). Enum'u const ile değiştirirsem bir fark alırım. Buna böyle yazmanın etkisiz olduğu söylendi. Bir tür uygun olduğunu düşünmüş ve verimsizlik görmüyorum. (Btw, satır yinelemeli denir bir fonksiyonu olan).
tam kod
import std.string;
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
static string sign;
if (n < 0) {
n *= -1;
sign = "-";
}
enum chars = digits ~ uppercase;
size_t r = cast(size_t)(n % b);
if (n == r) {
return sign ~ chars[r];
}
return toBase((n - r)/b, b) ~ chars[r];
}
Düzenleme (farklı tabanı olan bir sayı sistemine dönüştürülmesi): Söz
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
enum chars = digits ~ uppercase;
long r = n % b;
char c = chars[cast(size_t) abs(r)];
if (n == r) {
return (n < 0 ? "-" : "") ~ c;
}
return toBase((n - r)/b, b) ~ c;
}
İşaret dizgisini sıfırlamayı unutmuştunuz ('scope (exit) 'işaretini = =" ";' bunun için), 'toBase (-10,10)' takiben 'toBase (10,10)' verecek aynı sonuç –
Sağ. Ha ha ha, ilk defa bir statik değişken kullanıyorum. Zor. Bu kapsam (çıkış) şey gerçekten yararlı değil mi? Biraz bir kapsam çıkış olarak nitelemek gelmez yinelemeli çağrı şaşırdım. – fwend
Geçerli bir kapsam çerçevesi yığınının üstüne atıldığında bir kapsam (çıkış) yürütülür (try ... son olarak gerçekten fazladan girinti olmadan) özyineleme bu –