Jump to page: 1 2
Thread overview
Bilmediğim bir sözdizilimi
Mar 31, 2022
Ferhat Kurtulmuş
Mar 31, 2022
Salih Dincer
Mar 31, 2022
Ferhat Kurtulmuş
Apr 06, 2022
Salih Dincer
Mar 31, 2022
Ali Çehreli
Mar 31, 2022
Ferhat Kurtulmuş
Mar 31, 2022
Ali Çehreli
Mar 31, 2022
Ferhat Kurtulmuş
Apr 01, 2022
Salih Dincer
Apr 01, 2022
Ferhat Kurtulmuş
Apr 01, 2022
Ferhat Kurtulmuş
Apr 01, 2022
Salih Dincer
Apr 01, 2022
Ali Çehreli
Apr 01, 2022
Ferhat Kurtulmuş
March 31, 2022

Herkese selamlar, karşılaştığım bazı kodlarda overload edilen fonksiyonların önünde nokta karakteri görüyorum. Belki de overload ile alakası da olmayabilir. Aşağıya bir örnek ekliyorum. Bu sözdizilimi ne anlama geliyor? Dökümantasyon linki veya açıklama yapabilir misiniz lütfen?

Şimdiden teşekkürler

Tip fonksiyon1(PTip1 birşey){
    ...
    BaskaTip1 başkaşey;
    ...
    return .fonksiyon1(başkaşey); // fonksiyon1'in başka bir overload'u
}
March 31, 2022

On Thursday, 31 March 2022 at 12:09:17 UTC, Ferhat Kurtulmuş wrote:

>

Herkese selamlar, karşılaştığım bazı kodlarda overload edilen fonksiyonların önünde nokta karakteri görüyorum. Belki de overload ile alakası da olmayabilir. [...]

Bence override veya overload ile alakası yok. Hani en iyi programcı en tembel olanıdır ya. Basitçe yapılan neciz ama tehlikeli çözüm çünkü gözden kaçar. Oradaki nokta dıştaki veya başka module bağla demek. Tıpkı change directory (cd..) komutu gibi. Kısaca bir önceki kapsama bak demek.

Örneğin bir sınıfın içinden başka bir nesneye örneğin string döndüren isim() işlevine sadece bir nokta koyarak ulaşabiliriz. Hatta dur, 2 modülümüz olsun daha etkileyici bir örnek olacak:

// main()'i içeren ilk modül:
module ana;

class Foo {
  string isim() {
    return "Foo Class";
  }

  override string toString() {
    return .isim;
}

import std.stdio, adi.d;
void main() {
  auto foo = new Foo();
  foo.writeln; // ÇIKTI: Bar Struct
}

// isim() işlevini içeren modül:
module adi;

struct Bar {
  string adı = "Bar Struct";
}

string isim() {
  Bar bar;
  return bar.adı;
}

Eğer dmd -run main.d -oftest adi.d şeklinde çalıştırılırsa (yukardaki kodlarda hatalar olabilir çünkü derlemeden yazdım) ekranda Foo değil Bar yazacak çünkü kapsam dışında isim() işlevini arayacak. En sonunda bulamazsa hata verecek.

Dilersek legal görülmesi için başına ekleme yapıp this.isim yazarak sınıf içindeki işleve ulaşması sağlanabilir ya da modül yerine aynı isimdeki işlev main dışında bir yerde de olabilir. Özetle nokta koyarak önceki kapsama ulaşılıyor.

Başarılar...

March 31, 2022

On Thursday, 31 March 2022 at 13:21:03 UTC, Salih Dincer wrote:

>

On Thursday, 31 March 2022 at 12:09:17 UTC, Ferhat Kurtulmuş wrote:

>

[...]

Bence override veya overload ile alakası yok. Hani en iyi programcı en tembel olanıdır ya. Basitçe yapılan neciz ama tehlikeli çözüm çünkü gözden kaçar. Oradaki nokta dıştaki veya başka module bağla demek. Tıpkı change directory (cd..) komutu gibi. Kısaca bir önceki kapsama bak demek.

[...]

Modüller arasında isim çakışmaları için bir çözüm o zaman. Açıklamalar için teşekkürler Salih Bey.

March 31, 2022
On 3/31/22 05:09, Ferhat Kurtulmuş wrote:
> Herkese selamlar, karşılaştığım bazı kodlarda overload edilen
> fonksiyonların önünde nokta karakteri görüyorum.

Benim bildiğim, "o ismi çözümlemeye bu modül düzeyinden başla" demek. Yani, başka türlü bulunabilecek bir isim değil, bu modül düzeyindeki ismi kullan. Şu kod, nokta kullanıldığı için modüldeki foo'yu çağırır:

import std.stdio;

void foo(int i) {
  writeln(__FUNCTION__);
}

void main() {
  void foo(int i) {
    writeln(__FUNCTION__);
  }

  .foo(42);
}

Nokta olmasaydı içerideki foo'yu çağırırdı.

Ali

March 31, 2022
On Thursday, 31 March 2022 at 14:42:03 UTC, Ali Çehreli wrote:
> On 3/31/22 05:09, Ferhat Kurtulmuş wrote:
> > Herkese selamlar, karşılaştığım bazı kodlarda overload edilen
> > fonksiyonların önünde nokta karakteri görüyorum.
>
> Benim bildiğim, "o ismi çözümlemeye bu modül düzeyinden başla" demek. Yani, başka türlü bulunabilecek bir isim değil, bu modül düzeyindeki ismi kullan. Şu kod, nokta kullanıldığı için modüldeki foo'yu çağırır:
>
> import std.stdio;
>
> void foo(int i) {
>   writeln(__FUNCTION__);
> }
>
> void main() {
>   void foo(int i) {
>     writeln(__FUNCTION__);
>   }
>
>   .foo(42);
> }
>
> Nokta olmasaydı içerideki foo'yu çağırırdı.
>
> Ali

Teşekkürler Ali Hocam. Bu kullanımın adı nedir veya bir adı var mıdır? Dil dökumantasyonunda yazıyor mu bir yerlerde? Ben bulamıyorum.
March 31, 2022
On 3/31/22 08:34, Ferhat Kurtulmuş wrote:

> Dil dökumantasyonunda yazıyor mu bir yerlerde? Ben bulamıyorum.

"Module scope operator" imiş:

  https://dlang.org/spec/module.html#module_scope_operators

Ali

March 31, 2022
On Thursday, 31 March 2022 at 15:53:44 UTC, Ali Çehreli wrote:
> On 3/31/22 08:34, Ferhat Kurtulmuş wrote:
>
> > Dil dökumantasyonunda yazıyor mu bir yerlerde? Ben
> bulamıyorum.
>
> "Module scope operator" imiş:
>
>   https://dlang.org/spec/module.html#module_scope_operators
>
> Ali

👍
April 01, 2022

On Thursday, 31 March 2022 at 15:53:44 UTC, Ali Çehreli wrote:

>

https://dlang.org/spec/module.html#module_scope_operators

Ali

Hocam link için teşekkürler, gün geçmiyor ki neler öğreniyor insan! İlgili başlığın biraz üstünü okuyunca herhangi bir işlevi yeniden adlandırılabildiğini (alias yaz = writef; gibi) bilmiyordum. Şimdi birkaç deneme yaptım:

  import std.stdio : writeln, yaz = writef;
  import core.stdc.stdio : printf;

  const(char)* a = "aâAÂ@";

void main()
{
  "Hey D".yaz!"%s, ";
  "Merhaba".writeln(*a); // en son 1 adet a yazıyor, demek ki dizge olduğunu bilmiyor

  printf("%s\n", a);
} /* ÇIKTISI:
Hey D, Merhabaa
aâAÂ@
*/

Tabi 2. örnekte neden printf kullanmadan birden fazla karakter yazamadığını tam anlayamadım. Tabi işaretçi sadece bir harfin olduğu adresi gösteriyor ve printf işevi, \0 görene kadar devam ediyor olmalı. Sanırım D, gerçek bir dizge istiyor. Bu durumda a işaretçi değişkeni üzerinde while döngüsü ile gezmek C yöntemi olabilir, değil mi?

Sevgiler, saygılar...

April 01, 2022

On Friday, 1 April 2022 at 07:48:38 UTC, Salih Dincer wrote:

>

On Thursday, 31 March 2022 at 15:53:44 UTC, Ali Çehreli wrote:

>

https://dlang.org/spec/module.html#module_scope_operators

Ali

Hocam link için teşekkürler, gün geçmiyor ki neler öğreniyor insan! İlgili başlığın biraz üstünü okuyunca herhangi bir işlevi yeniden adlandırılabildiğini (alias yaz = writef; gibi) bilmiyordum. Şimdi birkaç deneme yaptım:

  import std.stdio : writeln, yaz = writef;
  import core.stdc.stdio : printf;

  const(char)* a = "aâAÂ@";

void main()
{
  "Hey D".yaz!"%s, ";
  "Merhaba".writeln(*a); // en son 1 adet a yazıyor, demek ki dizge olduğunu bilmiyor

  printf("%s\n", a);
} /* ÇIKTISI:
Hey D, Merhabaa
aâAÂ@
*/

Tabi 2. örnekte neden printf kullanmadan birden fazla karakter yazamadığını tam anlayamadım. Tabi işaretçi sadece bir harfin olduğu adresi gösteriyor ve printf işevi, \0 görene kadar devam ediyor olmalı. Sanırım D, gerçek bir dizge istiyor. Bu durumda a işaretçi değişkeni üzerinde while döngüsü ile gezmek C yöntemi olabilir, değil mi?

Sevgiler, saygılar...

Salih senin örnekte writeln fonksiyonuna a işaretçisinin dereferansı olan const(char) veriyorsun ve writeln kendinden bekleneni yaparak sadece o adresteki ilk karakteri görüntülüyor. O satırı "Merhaba".writefln("%s", a); olarak güncellersen dizenin hepsini yazacaktır. Tabi şunu unutmamalı ki "aâAÂ@" hazır değeri en sonda sıfır baytını içerdiğinden sorun çıkmıyor. Eğer a işaretçisi sıfır baytıyla bitmeyen bir dizenin başlangıcını gösteriyorsa o zaman toStringz ile veya manuel olarak ~ '\0' sıfır baytını eklemek gerekir.

April 01, 2022

On Friday, 1 April 2022 at 08:36:27 UTC, Ferhat Kurtulmuş wrote:

>

On Friday, 1 April 2022 at 07:48:38 UTC, Salih Dincer wrote:

>

On Thursday, 31 March 2022 at 15:53:44 UTC, Ali Çehreli wrote:

>

https://dlang.org/spec/module.html#module_scope_operators

Ali

Hocam link için teşekkürler, gün geçmiyor ki neler öğreniyor insan! İlgili başlığın biraz üstünü okuyunca herhangi bir işlevi yeniden adlandırılabildiğini (alias yaz = writef; gibi) bilmiyordum. Şimdi birkaç deneme yaptım:

  import std.stdio : writeln, yaz = writef;
  import core.stdc.stdio : printf;

  const(char)* a = "aâAÂ@";

void main()
{
  "Hey D".yaz!"%s, ";
  "Merhaba".writeln(*a); // en son 1 adet a yazıyor, demek ki dizge olduğunu bilmiyor

  printf("%s\n", a);
} /* ÇIKTISI:
Hey D, Merhabaa
aâAÂ@
*/

Tabi 2. örnekte neden printf kullanmadan birden fazla karakter yazamadığını tam anlayamadım. Tabi işaretçi sadece bir harfin olduğu adresi gösteriyor ve printf işevi, \0 görene kadar devam ediyor olmalı. Sanırım D, gerçek bir dizge istiyor. Bu durumda a işaretçi değişkeni üzerinde while döngüsü ile gezmek C yöntemi olabilir, değil mi?

Sevgiler, saygılar...

Salih senin örnekte writeln fonksiyonuna a işaretçisinin dereferansı olan const(char) veriyorsun ve writeln kendinden bekleneni yaparak sadece o adresteki ilk karakteri görüntülüyor. O satırı "Merhaba".writefln("%s", a); olarak güncellersen dizenin hepsini yazacaktır. Tabi şunu unutmamalı ki "aâAÂ@" hazır değeri en sonda sıfır baytını içerdiğinden sorun çıkmıyor. Eğer a işaretçisi sıfır baytıyla bitmeyen bir dizenin başlangıcını gösteriyorsa o zaman toStringz ile veya manuel olarak ~ '\0' sıfır baytını eklemek gerekir.

Ek olarak tabii ki d string'i yani immutable(char)[] kullanılırsa uzunluk bilgisi zaten tipin instance'ı ile birlikte taşındığından sıfır bayt gibi bir gereklilik ortadan kalkıyor.

import core.stdc.string : strlen; // string literalinin uzunluğu için
import std.exception : assumeUnique; // immutable yapmak için

string sa = a[0..strlen(a)].assumeUnique;
"Merhaba".writeln(sa);

« First   ‹ Prev
1 2