(Öncelikle forumu canlandırdığın için teşekkürler. Daha önce de konuştuk ama böyle tekrarlar herkes için çok çok yararlı oluyor.)
Ben çoğunlukla katılıyorum. :) Çoğu durumda olduğu gibi yararlarıyla zararlarını ölçerek kullanmak gerek.
Yalnızca bütünlük amacıyla bir kaç şeyi hatırlatacağım:
-
Bölüm başlığı olarak 'auto' kullanmama rağmen "Başka belirteçler de türün otomatik olarak anlaşılması için yeterlidir" demiştim. Aslında auto yerine const, immutable, vs. de kullanılabiliyor: http://ddili.org/ders/d/auto.html
-
Ama çoğu durumda 'auto' kullanılıyor.
-
C++11'de yalnızca 'auto' kullanılabildiği için baştan ben yanılmış ve yalnızca 'auto' kullanılabiliyor sanmıştım.
Bence 'auto' C++11'de de olduğu gibi, türün sağda açıkça belli olduğu durumlarda kullanılabilir:
UzunBirTürİsmi u0 = UzunBirTürİsmi(42); // <-- tür gereksizce tekrarlanıyor
auto u1 = UzunBirTürİsmi(42); // <-- burada tür açıkça belli
Aklıma gelen başka bir kullanımı da türün bizi gerçekten ilgilendirmediği durumlar olabilir. Örneğin işlerini özel aralık nesneleri ile tembel olarak halleden algoritmaların dönüş türlerini bilmemek bazen daha iyi olabiliyor.
Şu bölümde güzel bir örneği var: http://ddili.org/ders/d/araliklar.html
Orada şöyle bir kullanım var:
writeln(take(cycle(take(FibonacciSerisi(), 5)), 20));
O zincirleme kullanımı herhangi bir nedenle açık olarak yazmak zorunda kalsak şöyle oluyor (ben açıklama amacıyla öyle yazmıştım; yoksa aşağıdaki gibi açıkça yazmak çoğu durumda gerekmez):
auto seri = FibonacciSerisi();
auto başTarafı = take(seri, 5);
auto tekrarlanmışı = cycle(başTarafı);
auto tekrarlanmışınınBaşTarafı = take(tekrarlanmışı, 20);
writeln(tekrarlanmışınınBaşTarafı);
Sol tarafta türleri açıkça yazmak isteseydik ne gerekirdi diye şöyle öğrenebiliriz:
writeln(typeof(seri).stringof);
writeln(typeof(başTarafı).stringof);
writeln(typeof(tekrarlanmışı).stringof);
writeln(typeof(tekrarlanmışınınBaşTarafı).stringof);
Çıktısı:
'FibonacciSerisi
Take!(FibonacciSerisi)
Cycle!(Take!(FibonacciSerisi))
Take!(Cycle!(Take!(FibonacciSerisi)))
'
Yani auto kullanmadan şöyle yazmak gerekirmiş:
FibonacciSerisi seri = FibonacciSerisi();
Take!(FibonacciSerisi) başTarafı = take(seri, 5);
Cycle!(Take!(FibonacciSerisi)) tekrarlanmışı = cycle(başTarafı);
Take!(Cycle!(Take!(FibonacciSerisi))) tekrarlanmışınınBaşTarafı = take(tekrarlanmışı, 20);
Zafer'e katılıyorum ama yukarıdaki gibi iki durumda 'auto'nun yararlı olduğunu düşünüyorum.
Bütün programı da vereyim:
import std.stdio;
import std.range;
struct FibonacciSerisi
{
int baştaki = 0;
int sonraki = 1;
static immutable bool empty = false;
@property int front() const
{
return baştaki;
}
void popFront()
{
int ikiSonraki = baştaki + sonraki;
baştaki = sonraki;
sonraki = ikiSonraki;
}
FibonacciSerisi save() const
{
return this;
}
}
void main()
{
writeln(take(cycle(take(FibonacciSerisi(), 5)), 20));
auto seri = FibonacciSerisi();
auto başTarafı = take(seri, 5);
auto tekrarlanmışı = cycle(başTarafı);
auto tekrarlanmışınınBaşTarafı = take(tekrarlanmışı, 20);
writeln(tekrarlanmışınınBaşTarafı);
writeln(typeof(seri).stringof);
writeln(typeof(başTarafı).stringof);
writeln(typeof(tekrarlanmışı).stringof);
writeln(typeof(tekrarlanmışınınBaşTarafı).stringof);
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]