Önce bir uyarı: byLine satırları hep aynı ara belleğe okur. Dolayısıyla, satırın içindeki bir veriyi elinde tutmak istiyorsan, örneğin 'saklanan = satır[x..y]' yapamazsın çünkü bir sonraki satır okununca aynı yerin üstüne yazılabilir. O yüzden, kopyalaman gerekir: 'saklanan = satır[x..y].idup' (veya duruma göre '.dup').
Başka yöntem, byLine değil, byLineCopy kullanmaktır. Bu, her satırı yeni belleğe okur. Hangi yöntemin daha iyi olduğuna duruma göre karar verilebilir. Örneğin, byLineCopy bütün satırı tek kere kopyalar ve sen mutlu mutlu 'saklanan = satır[x..y]' yapabilirsin.
formattedRead, formattedWrite'ın yazabildiği çoğu şeyi (herşeyi?) okumalı:
import std.stdio;
import std.format;
void main() {
string[] dizi;
string satir = `[ "abc", "xyz" ]`;
formattedRead(satir, "%s", &dizi);
writeln(dizi);
}
Başka yöntemler de var: splitter, regex, vs.
(Bunu zaten sonradan düzeltmişsin.) elemanlar dizisiyle ilgili hata bariz. :) elemanlar'a hiç eleman eklemeden ilk elemanına erişmeye çalışıyorsun. Şöyle olabilir:
elemanlar ~= Eleman("ahmet"); // Artık elemanı var
Ama bazen böyle döngüyle uğraşmak yerine zincirleme çağrılar öneriliyor:
import std.algorithm : findSplit;
import std.range.primitives : isInputRange;
import std.algorithm : map, filter, each, splitter;
import std.stdio : writefln;
import std.array : array;
struct Eleman(Özellikler) if (isInputRange!Özellikler) {
string isim;
Özellikler özellikler;
}
// Yalnızca bir kolaylık işlevi; kodda eleman(a, b) diye oluşturabiliyoruz
auto eleman(Özellikler)(string isim, Özellikler özellikler) {
return Eleman!Özellikler(isim, özellikler);
}
void main() {
auto satırlar = [ "h2:class id", "span:", "img:class id src", "istenmeyen: foo" ];
auto elemanlar = satırlar
.map!(satır => satır.findSplit(":")) // çokuzlu döndürür; ç diyorum:
.filter!(ç => ç[0] != "istenmeyen")
.map!(ç => eleman(ç[0], ç[2].splitter));
// Şimdi 'elemanlar' tembelce oluşturulan bir aralıktır
writefln("Okunan elemanlar: %s", elemanlar);
// Ama istersek örneğin hepsinden oluşan bir dizi oluşturabiliriz:
auto dizi = elemanlar.array;
writefln("Oluşturulan dizi: %-(%s, %)", dizi);
}
Duruma göre bu çok daha iyi olabiliyor çünkü bu örnekte örneğin bütün elemanları writefln ile yazdırabildiğimiz halde hiçbirisi için yer ayırmak zorunda kalmadık. Milyonlarca eleman olduğunda az bellek kullandırdığından bu yöntem daha hızlıdır.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply