Ş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.dlang.org
Ö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
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]