| |
| Posted by Ali Çehreli in reply to Salih Dincer | PermalinkReply |
|
Ali Çehreli
Posted in reply to Salih Dincer
| On 6/6/21 2:04 PM, Salih Dincer wrote:
> Kod yazarken UFCS'nin esnekliğini seviyorum.
UFCS, modül düzeyinde yazılmış olan bir işlevin sanki üye işlevmiş gibi çağrılmasıdır. Burada modül düzeyinde işlev olmadığından UFCS diyemeyiz. Burada D'nin başka bir olanağını görüyoruz: Parametre almayan işlevlerin parantezsiz de çağrılabilmeleri. Sanırım buradaki konu bununla ilgili...
> Ama fazla mı esnek acaba?
Haklısın; karışıklık oluyor. test.bar deyince test'in bar işlevinden mi bahsediyoruz yoksa test'in bar işlevini çağırıyor muyuz?
> Çünkü bir sınıf içinden döndürülen bir dizge dilimlere ayrılıyorken,
> nedense köşeli parantezi iki şekilde de kabul ediyor:
Köşeli parantezlerin ilgisini henüz göremiyorum. Ama ~ veya ~= işleci uygulandığında yepyeni bir dizgi oluşacağını bekleyebiliriz. (Bazı durumlarda eniyileştirme sonucunda yeni bellek ayrılmaz.)
>
> ```d
> import std.stdio;
>
> class foo {
> string data;
>
> this(string str) {
> this.data = str;
> this.data.ptr.writeln;
> /* printOut: xxxxxxxxA0D2 */
> }
>
> auto bar() {
> string str = data[0..3];
> str ~= data[3..$];
> return str;
> }
> }
>
> void main()
> {
> auto test = new foo("result");
>
> test.bar.writeln(", ", &test.bar);
> /* printOut: result, string delegate() */
Tamam: bar işlevini çağıracak olan bir 'delegate'.
>
> test.bar[0..3].writeln(", ", test.bar.ptr);
> /* printOut: res, xxxxxxxx0030 */
bar'ın döndürdüğü yeni dizginin karakterlerinin adresi.
> test.bar()[3..$].writeln(", ", test.bar().ptr);
> /* printOut: ult, xxxxxxxx0050 */
bar her çağrıldığında yeni bir dizgi oluşur. O yüzden farklı bir adres görüyoruz.
> }
> ```
>
> Tamam, yukarda sınıf kurulduktan sonra yapılan ilk denemede bunun dizge
> temsilcisi olduğunu görüyoruz; üstelik farklı ptr adresi dödürdüğünü de!
> Bence son yaptığım denemem, olması gereken çünkü ben sınıf içindeki
> (string data) dizgeyi doğrudan çağırmıyorum ki...
>
> Ne dersiniz?
Burada iki nokta var:
- &test.bar, bar'ı çağırmıyor.
- ~ ve ~= işleçleri yeni dizgi oluştururlar.
> Teşekkürler...
Rica ve tekrar hoşgeldin. :)
Ali
|