Merhaba,
Şurda başlayan ama birazdan iki ilginç sonuca varacağımız aşağıdaki örnek de bir başka güzel! Aslında Voldemort kavramından uzaklaştım çünkü 2. bir özellik için yapıyı işlev dışına çıkardım:
struct SliceString(string E)
{
import len = std.string;
long index, back, next = -1;
string data;
this(string data)
{
this.data = data;
this.index = len.split(data).length;
}
@system
{
bool empty()
{
return index < 0;
}
auto front()
{
return data[back..next];
}
void popFront()
{
--index;
back = ++next;
next = len.indexOf(data, E, next);
if(next == -1) next = data.length;
}
}
auto popIndex()
{
this.popFront();
return [back, next];
}
}
auto split(string E)(string data)
{
auto s = SliceString!E(data);
s.popFront();
return s;
}
import std.stdio;
void main()
{
auto dizge = "bu bir denemedir";
auto s = SliceString!" "(dizge);
long[2] dilim_paramterleri = s.popIndex;
while(!s.empty)
{
dilim_paramterleri.writeln;
dilim_paramterleri = s.popIndex;
} // popIndex(): [0, 2] [3, 6] [7, 16]
auto birAralık = dizge.split!" ";
foreach(r; birAralık)
r.writeln;
enum boşDeğil = false; // Voldemort Types örneğinde boştu!
assert(birAralık.empty == boşDeğil);
} /* ŞURDA BAŞLADI:
https://forum.dlang.org/post/zdroayoznvcqkdzhwwfu@forum.dlang.org
*/
Yukarda 2. özelliği popIndex() olarak görmektesiniz. Yani bir nevi split() yapıyor ama dizgenin dilimlediği baş/son parametrelerini döndürüyor. Özetle yapıya iki özellik verdik. Diğer ilginç nokta ise şu:
Önceki Voldemort örneğinde, kod biterken işaret ettiğim gibi yapı foreach() tarafından tüketiliyordu (oysa önce yedeğini alırdı, alamadı demek ki!) ve birAralık boş kalmaya devam ediyordu. Burda ise boş yani yapıyı işlev dışına almak daha akıllıca olabilir.
D çok güzel, sizce değil mi?