2010-12-03 18 views
10

Birisi aşağıdaki kodu açıklayabilir mi? T'nin bu durumda nasıl çalıştığını anlamaya çalıştığımda kafam karışıyor.D programlamasındaki şablon

auto foo(T)(T n) if (isNumeric!T) { 
    return (T m) {return m > n;}; 
} 

void main() { 
    auto hoo5 = foo!int(1000); 
    writeln(hoo5(93)); 
    writeln(hoo5(23)); 
} 

cevap

13

Başlangıç ​​ile:

auto foo(T)(T n) if (isNumeric!T) { 
    // ignore this for now 
} 

foo onun Jenerik türden bir argüman alır jenerik fonksiyonudur. if (isNumeric!T), fo'nun türünün sayısal olduğunu garanti eden std.traits numaralı derleme zamanı denetimidir. Sayısal olmayan türler çalışmayacak. Dönüş tipi çıkar ve bu durumda bir delege.

Bu:

(T m) {return m > n;}; //returned from foo 

bir delegate literal (or closure) 'dir. Temelde devlet ile bir fonksiyon gösterici. Bu durumda, foo'ya iletilen n parametresi üzerinden kapanır. Örnekte:

auto hoo5 = foo!int(1000); 

etkili bir işleve çevrilmiştir: Eğer hoo5 çağırdığınızda Yani, onun argümanı 1000 büyükse belirten bir boolean döndüren

bool hoo5 (int x) { return x > 1000; } 

- ama yalnızca belirli durumlarda . Böyle foo ararsanız

:

auto hoo5 = foo!double(1.2345); 

Bunu argüman (çift) 1.2345 büyükse belirten bir boolean döndüren bir işleve bir referans olsun.

+0

Yazım hataları var. Onu tamir ettim. Teşekkürler! – Nate

+1

Gerçekten iyi açıklıyorsunuz. Şimdi anlıyorum. Teşekkür ederim. – Nate