Forum: D Programlama Dili RSS
Şablon katmasının ihtiyaç duyduğu modüller o şablonun içinde "import edilmeli"
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Şablon katmasının ihtiyaç duyduğu modüller o şablonun içinde "import edilmeli"
Şablon katmalarını hatırlamak için:

  http://ddili.org/ders/d/katmalar.html

Onlarla ilgili yeni bir şey öğrendim: Şablon katmalarının koda katıldıkları noktada değerlendirildiklerini biliyordum. Ancak, bir şablon katmasının ihtiyaç duyduğu bütün import bildirimlerinin o şablonun kendi içinde bulunması gerektiğini bilmiyordum.

Bu konu şurada geçti:

  http://forum.dlang.org/thread/olvhztchmyxbedqmfanm@forum.d…

Örneğin, aşağıdaki şablon katması üç modülden yararlanıyor. Ancak, bu modüller programın başında eklendiklerinden, aslında şablonun eksik olduğu kabul edilir. Tabii, bu eksiklik tek dosyadan oluşan aşağıdaki programda farkedilmiyor:
import std.stdio;
// NOT: Aşağıdakiler aslında yanlış noktada eklenmişler!
import std.range;
import std.algorithm;
import std.conv;
 
// Not: Kitapta burada 'mixin' anahtar sözcüğü de bulunmuyor.
mixin template mesajVerİşlevi(size_t adet)
{
    string mesajVer(string mesaj)
    {
        return
            adet
            .iota
            .map!(_ => mesaj)
            .joiner(", ")
            .to!string;
    }
}
 
struct S
{
    // S bu sayede mesajVer() adında bir işlev edinir
    mixin mesajVerİşlevi!3;
}
 
void main()
{
    auto s = S();
 
    writeln(s.mesajVer("merhaba"));
}
Çıktısı:

merhaba, merhaba, merhaba

Eğer o şablon başka bir modülde olsaydı ve o modülden yararlanan başka modüller std.range, std.algorithm, ve std.conv modüllerini kendileri eklememiş olsalardı derleme hatası alınırdı. O yüzden, şablonun yararlandığı modüllerle ilgili import'lar kendi içine (de) taşınmalı:
mixin template mesajVerİşlevi(size_t adet)
{
    string mesajVer(string mesaj)
    {
        // Şimdi doğru yerdeler.
        import std.range;
        import std.algorithm;
        import std.conv;
 
        return
            adet
            .iota
            .map!(_ => mesaj)
            .joiner(", ")
            .to!string;
    }
}
Not aldım; bu konuyu o bölüme ekleyeceğim.

Ali
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler, çok faydalı bir alışkanlık!

Hani bazen bu kod niye derlenmez veya garip çalışırız deriz; ya başka bir kütüphanede yolunu bulunmuştur ya da aradığını bulamamıştır ama bilmeyiz :)

İşte bu tür şeylere dikkat etmek önemliydi, paylaşım için tekrar teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 11:25:59 (UTC -08:00)