Alıntı (Acemi):
> Sanırım chain ve canFind, std.algorithm içerisinde bulunuyor
chain std.range içinde. Yaptığı, kendisine verilen ayrık aralıkları tek aralık olarak sunmak.
canFind da nerede olduğuna bakmadan bulunup bulunmadığını bildiriyor.
Alıntı:
> Ben dizi içerisinde arama işlemini çok araştırmış ama ne yazık ki bulamamıştım.
Hatırlatmak için, standart kütüphane belgeleri şurada:
http://dlang.org/phobos/index.html
Sol taraftaki std.algorithm'e tıklayınca find bulunuyor. Ancak, find da aralıklarla işlediğinden bulduğu elemanı değil, bulduğu eleman ve sonrasını döndürür:
import std.algorithm;
void main()
{
auto a = [ 1, 10, 3, 3, 8 ];
assert(a.find(3) == [ 3, 3, 8 ]);
}
Dolayısıyla, bulunup bulunmadığını sonucun boş olup olmadığına bakarak anlayabiliyoruz ve ilk bulunana front ile erişiyoruz (dilimlerin aralık olarak kullanılabilmeleri için std.range gerekir):
import std.range;
// ...
auto sonuç = a.find(3);
if (!sonuç.empty) {
assert(sonuç.front == 3);
}
findSplit de çok kullanışlı; öncesini, bulunanı, ve sonrasını döndürür:
// Arananın da aralık olması gerekiyor; onun için [ 3 ]:
auto sonuç = a.findSplit([ 3 ]);
assert(sonuç[0] == [ 1, 10 ]);
assert(sonuç[1] == [ 3 ]);
assert(sonuç[2] == [ 3, 8 ]);
Alıntı:
> try-catch denedim ama ne yazık ki sonuç alamadım :(
Kodunu göremediğimiz için neden olmadığını anlayamıyoruz. ;) Şöyle olur herhalde:
import std.stdio;
import std.array;
int intOku()
{
while (true) {
try {
int sayı;
write("Bir sayı giriniz (çıkmak için -1): ");
readf(" %s", &sayı);
return sayı;
} catch (Exception) {
writeln("HATA: Sayıya dönüştüremedim.");
stdin.clearerr();
stdin.readln();
}
}
}
void main()
{
int sayı;
while (sayı != -1) {
sayı = intOku();
}
}
Görüldüğü gibi, giriş akımının hatalı duruma gelmesi belalı bir iş. Onun yerine, her zaman için tam satır okuyup ondan sonra o satırı formattedRead ile kullanmak daha kolay olabilir:
import std.stdio;
import std.array;
import std.string;
import std.format;
int intOku()
{
while (true) {
try {
write("Bir sayı giriniz (çıkmak için -1): ");
string satır = chomp(readln());
int sayı;
formattedRead(satır, " %s", &sayı);
return sayı;
} catch (Exception) {
writeln("HATA: Sayıya dönüştüremedim.");
}
}
}
void main()
{
int sayı;
while (sayı != -1) {
sayı = intOku();
}
}
Alıntı:
> hatayı neden veriyor ben pek anlayamadım...
alias'ın artık ifadelerle kullanılamadığı gibi bir şeyler konuşulduğunu hatırlar gibiyim ama emin değilim. (?)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]