Merhaba,
Teknik olarak çok fazla açıklamasını bilmiyorum ama alias ... this
ile bağlayıp inout
özellikli bir işlevi ikiliyi @property
kullanmadığımızda doğru çalışmayacağını garanti eden bir yapımız var:
struct FixedStr(size_t capacity)
{
char[capacity] data = ' ';
char[] buff;
this(string _data) {
buff = data[];
this ~= _data;
}
alias opReturn this;
//* v--- bu olmayınca farklı sonuç* alınıyor!
@property //*/
auto opReturn() inout
=> data[6..$]; // cuts off the header
auto ref opOpAssign(string op)(string arr) if(op == "~")
=> buff.put(arr); // add in the data
}
Yukardaki gibi 2 işlevli (sondaki işleç yükleme) bir yapımız olsun. Aslında işlevlerin doğrudan kullanıma açık bir özelliği yok. Yani yok hükmünde düşünün ki zaten opReturn()
gibi bir işleç yükleme yok, benim uydurmam :)
Yaptığı ise basit: Sabit (fixed) bir char
dizisini baştan kırparak döndürmek (dış dünyaya açmak) ve sınırına kadar içine sırayla (std.range.put
marifetiyle) veri eklemek. Ancak bunu tanıdık olduğumuz string
gibi kullanmak (örneğin 2. satır çıktısı: "two") da istiyoruz. Test etmek için ise şu kodu kullanabilirsiniz:
// (*): FixedStr!21LU("Veri: six, two, one, ", "")
import std.stdio, std.format;
import std.range;
void main()
{
enum text = "sixtwoone";
auto test = FixedStr!21("Veri: ");
foreach(num; text.chunks(3))
{
test ~= num.format!"%s, ";
}
test.writeln; // six, two, one,
test[6..9].writeln; // two
}
Tamam, bu sorunun çözümü en basit şekilde varsayılan toString()
üzerine kendimiz bir şeyler yazmak olabilir ama o zaman alias ... this
gibi işlevsel bir çıktı (kurulurken veriyle eklenen başlığı silmek) elde edemeyiz ve dilimleneni dilimleyemeyiz.
Özetle neden writeln()
ile ekrana yazarken @property
'e ihtiyaç duyduk? Aslında sebebini tahmin edebiliyorum. Ali hoca bize bunu, derlenirken pragma
mesajı ile göstermişti. Sanırım bir işlev nesnesi gibi sonunda çift parantez => "opReturn()" gözükmesi bunu sağlıyor!
Dip Not: Aradaki farkı görmek için gizlenen @property
üstündeki çiftli yorum satırını teke düşürmeniz yeterli.
Sevgiler, saygılar...