Thread overview
GBS-8: Statik Listeli Sınıf
Jul 26, 2022
Salih Dincer
Jul 27, 2022
Salih Dincer
Jul 29, 2022
Salih Dincer
July 26, 2022

Merhaba,

Kendi türündeki nesnelerin bellekteki adreslerini not eden aşağıdaki gibi bir sınıf düşünün. Aslında şöyle de hayal edebilirsiniz:

IP sınıfındaki list dizisi/not ekleme mekanizması, sınıfın dışında bir yerde ve program boyunca oluşturduğunuz her IP nesnesi eğer bu liste içinde yoksa otomatik ekleniyor. Yani tekrarına izin verilmiyor ve bunu da dizi elemanlarını her seferinde aptalca is ile ile tarayarak yapıyor.

Yani siz eklemeye çalışırsanız (aşağıda bunu yaptım!) atlanıyor. Ama id'si önemsiz başka birini ekleyebilirsiniz. Çünkü is'e göre aynı değil (-bknz. if l is this) ve açıkcası buraya kadar anlasam da ne işe yarayaleceğini bilmiyorum! 😀

import std.stdio;

class IP {
  char id;

  this(char c) {
    id = c;
    ekle();
  }

  static IP[] list;

  void ekle() {
    foreach(ref l; list) {
      if(l is this) {
        writeln("Tekrar eklenemez!");
        goto atla;
      }
    }
    list ~= this;

    atla: return;
  }

  override string toString() {
    return [id];
  }
}

void main()
{
  auto ip1 = new IP('a');
  auto ip2 = new IP('b');
  ip1.list.writeln;
  ip1.ekle();
  ip1.list.writeln;

  write("ama id'si aynı başka bir sınıf, ");
  auto ip3 = new IP('b');
  writeln("eklendi bile!");
  ip3.list.writeln;
}
/* ÇIKTISI:

[a, b]
Tekrar eklenemez!
[a, b]
ama id'si aynı başka bir sınıf, eklendi bile!
[a, b, b]

*/

Özetle, Gereksiz Bilgiler Serisi'nin sonuncusunda (GBS-8), sınıflı, statikli, etiketli, is'li saçma sapan bir şey öğrendim ve bunu paylaşmak istedim.

Başarılar...

July 27, 2022

On Tuesday, 26 July 2022 at 18:40:10 UTC, Salih Dincer wrote:

>

Merhaba,

Kendi türündeki nesnelerin bellekteki adreslerini not eden aşağıdaki gibi bir sınıf düşünün. Aslında şöyle de hayal edebilirsiniz:

//struct IP { /*
class IP { override //* toggle class<->struct */
  string toString() {
    return [id];
  }
  //...
}

Veee bir soru!

Sınıf değil de yukardaki pratik yapı formunu kullanarak geçişi açtığınızda 'b' id'li 2 nesne listemize eklenemiyor! Sebebini bilmiyorum, sizce?

Yani is işleçi ile bir alakası olabilir mi! Neticede new işleçi ile kurduğumuza göre farklı adresleri bulunan 2 nesne bunlar...

Dip Not: Bu gönderiden hemen sonra adreslerini de kontrol edeceğim. Belki son satırın aynı sonuçu göstermesi ile alakalı olabilir.

July 29, 2022

On Wednesday, 27 July 2022 at 07:37:42 UTC, Salih Dincer wrote:

>

On Tuesday, 26 July 2022 at 18:40:10 UTC, Salih Dincer wrote:

>

Merhaba,

Kendi türündeki nesnelerin bellekteki adreslerini not eden aşağıdaki gibi bir sınıf düşünün. Aslında şöyle de hayal edebilirsiniz:

//struct IP { /*
class IP { override //* toggle class<->struct */
  string toString() {
    return [id];
  }
  //...
}

Veee bir soru!

Sorduğum sorunun cevabını sanırım anladım ve başka cevap gelir umuduyla sakladım. Kaynağım şuraydı:

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

Genel Durum:

Öncelikle listemiz zaten statik, yani ona erişmek için özel bir nedeniniz yoksa nesnelerin dışına da alabilirsiniz ama içinde olması ayrı bir hava katıyor. Tek esprisi tek kopya olan listenin her nesne içinde varmış gibi görünmesi/erişilmesi.

Sınıflardaki Durum:

Aynı adresteki nesneyi tekrar listeye eklemediğiniz müddetçe içeriği aynı olsun/olmasın ekliyor. Zaten adres aynıysa yapılarda da eklemiyor.

Yapılardaki Durum:

Asıl janjanlı (ama maliyetli) durum yapılarda mükemmel çalışıyor. Eğer üyelerden birinin içeriği farklı olursa ekliyor. Yani is işleçi her üyeyi tek tek kontrol ediyormuş.

Başarılar...