SORU
16 EKİM 2008, PERŞEMBE


İşlev işaretçileri, Kilitler, ve Lambda

Sadece işlev işaretçileri öğrenme artık ve bu konuda K&R bölüm beni vurdu ilk şey hazırlamaya çalışıyordum, "Hey, bu bir kapatma gibi bir şey." ben Bu varsayım temelden yanlış bir şekilde bir arama online gerçekten bu karşılaştırma herhangi bir analiz bulmak için olmadığını biliyordum.

Neden C tipi işlev işaretçisi kapatma veya Lambda daha temelde farklı? Bunu söyleyebileceğim kadarıyla var işlev işaretçisi hala isimsiz işlev tanımlamak için güçlü olmak(karşıt olarak adlandırılır) tanımlanan bir fonksiyonu işaret ediyor aslında.

Neden, sadece geçirilen normal günlük bir işlevi olduğu daha önce isimsiz bir işlev ikinci durumda daha güçlü olarak görülen, bir işlevi geçiyor?

İki çok yakından karşılaştırmak yanlış nasıl olduğumu söyle lütfen.

Teşekkürler.

CEVAP
16 EKİM 2008, PERŞEMBE


Lambda (closure) Her iki işlev işaretçisi ve değişkenleri saklar. Bu yüzden, C#, yapabilirsiniz:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
   return i < lessThan;
};

Kapatılması halinde lessThan (yığın değişken) yakalanan isimsiz bir temsilci bir kapatma olarak orada (sözdizimi biraz daha net ve lambda eşdeğer daha C daha yakın), kullandım. Kapatılması değerlendirildiğinde, lessThan tahrip edilmiş olan () referans olmaya devam edecektir. Eğer lessThan değiştirirsem, o zaman karşılaştırma değiştiriyorum:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
   return i < lessThan;
};

lessThanTest(99); // returns true
lessThan = 10;
lessThanTest(99); // returns false

C, bu yasadışı olurdu:

BOOL (*lessThanTest)(int);
int lessThan = 100;

lessThanTest = &LessThan;

BOOL LessThan(int i) {
   return i < lessThan; // compile error - lessThan is not in scope
}

bir işlev işaretçisi tanımlayabilirim ama bu 2 argüman alır:

int lessThan = 100;
BOOL (*lessThanTest)(int, int);

lessThanTest = &LessThan;
lessThanTest(99, lessThan); // returns true
lessThan = 10;
lessThanTest(100, lessThan); // returns false

BOOL LessThan(int i, int lessThan) {
   return i < lessThan;
}

Ama, şimdi ben bunu değerlendirmek 2 argüman geçmek zorundayım. Eğer diledim geçmek bu işlev işaretçisi başka bir fonksiyonu lessThan değildi kapsam, ben de elle tutmak hayatta geçen her bir işlev zinciri, ya da teşvik için bir global.

Kilitler destekleyen en yaygın diller anonim fonksiyonları kullanmak rağmen, bunun gereği yok. Anonim fonksiyonları olmadan kilitler ve kapaklar olmadan anonim işlevler olabilir.

Özet: bir kapatma işlevi işaretçi değişkenler yakalanan bir kombinasyonudur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • michaeljacksonVEVO

    michaeljacks

    2 EYLÜL 2009
  • MrOctopi

    MrOctopi

    6 Aralık 2010
  • New Scientist

    New Scientis

    27 Kasım 2006