Merhaba,
Konuyla ilgili olarak örneklere (kodları biraz değiştirdim) benimle alakalı olmayan güncelleme gelmiş. Fark edince hemen konuyu aşağıda inceledim; önce kötü örnek önerilen dönüşü yöntemiyle ve main()
'den sonra iyi örnek std.exception
bağımlılığı olmadan nakletmeye çalıştım...
Kötü örnek dışarıdan bir private char[] buffer
kullanırken iyi örnek yerel, yani kendine özel char[] privateBuffer
ile önbellekleme yapıyor. Bir önbellek üzerinde metinlerle çalışırken ve bunu buffer üzerinden değil de değişmez yani immutable olarak aktarmak isterseniz dikkat etmenizde fayda var:
import std.conv, std.stdio;
/// KÖTÜ ÖRNEK ///
string badLetters(char first = 'a', char last = 'f')
in(first < last) {
char[] sneaky = buffer; // sneaky bir dilim
sneaky.length = last - first + 1;
foreach (i, ref e; sneaky)
{
e = cast(char)(first + i);
}
//return assumeUnique(sneaky);/* bu durumda önerilen:
return to!(string)(sneaky); //*/
}
private char[] buffer;
/// KÖTÜ ÖRNEK ///
void main()
{
buffer ~= ".Dlang.";
auto bad = badLetters();
typeid(bad).writeln(": ", bad);
buffer.writeln;
auto fine = fineLetters();
typeid(fine).writeln(": ", fine);
}
/// İYİ ÖRNEK ///
string fineLetters(char first = 'a', char last = 'f')
in(first < last) {
char[] privateBuffer = new char[last - first + 1];
foreach (i, ref e; privateBuffer)
{
e = cast(char)(first + i);
}
return assumeUnique(privateBuffer);
}
/// İYİ ÖRNEK ///
//import std.exception;/*
pure nothrow:
auto assumeUnique(T)(T[] array) {
return .assumeUnique(array);
}
auto assumeUnique(T)(ref T[] array) {
auto result = cast(immutable(T)[]) array;
array = null;
return result;
}
auto assumeUnique(T, U)(ref T[U] array){
auto result = cast(immutable(T[U])) array;
array = null;
return result;
}
//*/
Başarılar...