Thread overview
@property'e ihtiyacımız olan bir durum!
November 19

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

November 19
On 11/19/22 06:41, Salih Dincer wrote:
>  bize bunu,
> derlenirken `pragma` mesajı ile

pragma(msg)'ın bir güzelliği, 'import std.stdio' filan demek gerekmediğinden kod daha kısa oluyor. :)

> `@property`

Haklısın. Bu olanaklar pek kullanılmadığından olsa gerek, birbirleriyle etkileşimleri de garip olabiliyor.

Olabildiğince basit kodlarla göstererek bildirmek yararlı olacaktır. Örneğin, opReturn gibi isimler kullanmak karışıklık yaratacaktır; ben oun araştırdım ve kendimi D1 olanağı olduğuna inandırdım. Ondan sonra senin yazdığını okuyunca anladım. :/

Ali

November 21
On Saturday, 19 November 2022 at 19:28:05 UTC, Ali Çehreli wrote:
> Olabildiğince basit kodlarla göstererek bildirmek yararlı olacaktır.

Açıkcası boşuna kürek çekmek olduğunu düşünüyorum. Hani birlikte bulduğumuz ve bildirimini eylülün başında yaptığın hata, unutulmuşa benziyor:

https://issues.dlang.org/show_bug.cgi?id=23319
November 20
On 11/20/22 20:36, Salih Dincer wrote:

> eylülün başında yaptığın hata, unutulmuşa benziyor:

Şu anda toplam 4590 bug görüyorum. En eskisi, Haziran 2010'dan:

  https://issues.dlang.org/show_bug.cgi?id=4361

Sırayla düzeltilmiyorlar tabii. Kim önemli olduğuna da bakarak yapabilecek zaman bulup ilgilenebiliyorsa...

Ali