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...
Permalink
Reply