Closure Nedir?
Coddy'nin Lua Journey'sinin Logic & Flow bölümünün bir parçası — ders 14 / 54.
Fonksiyonların değişkenlerde saklanabildiğini, argüman olarak aktarılabildiğini ve diğer fonksiyonlardan döndürülebildiğini öğrendiniz. Şimdi bunun en güçlü sonuçlarından birini keşfedeceğiz: closure'lar.
Bir closure, iç içe geçmiş bir fonksiyonun, dıştaki fonksiyonun yürütülmesi tamamlandıktan sonra bile, onu çevreleyen fonksiyondaki yerel değişkenleri "hatırlaması" durumunda oluşur. Bu ilk başta garip gelebilir; onu oluşturan fonksiyon bittikten sonra bir değişken nasıl hala var olabilir?
İşte bu kavramı gösteren basit bir örnek:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Çıktı: 1
print(counter()) -- Çıktı: 2
print(counter()) -- Çıktı: 3createCounter() çağrıldığında, yerel bir count değişkeni oluşturur ve anonim bir fonksiyon döndürür. Normalde, createCounter() tamamlandığında count değişkeninin kaybolmasını beklersiniz. Ancak döndürülen fonksiyonun hala count değişkenine erişimi vardır; bu değişkeni "kapsar" (closes over).
counter() fonksiyonunu her çağırdığınızda, createCounter() ilk kez çalıştığında oluşturulan aynı count değişkenine erişir ve onu değiştirir. İç fonksiyon, ortamını beraberinde taşır ve çağrılar arasındaki durumu korur.
Görev
KolayBelirli bir faktörle bir çarpan fonksiyonu oluşturan ve ardından bu fonksiyonu verilen bir sayıyı çarpmak için hemen kullanan bir createMultiplier fonksiyonu yazın.
Mantık:
createMultiplieriçinde bir sayı parametresi alan iç içe geçmiş bir fonksiyon oluşturun- İç içe geçmiş fonksiyon, parametresini dış fonksiyondan gelen
factorile çarpmalıdır - İç içe geçmiş fonksiyon,
factordeğerini hatırlayarak bir closure (kapsam) oluşturacaktır - Çarpan fonksiyonunu
numberparametresi ile çağırın ve sonucu döndürün
Parametreler:
factor(sayı): Çarpan değerinumber(sayı): Çarpılacak sayı
Dönen Değer:
number'ınfactorile çarpılmasının sonucu (sayı)
Kopya kağıdı
Bir closure (kapsam), iç içe geçmiş bir fonksiyonun, dıştaki fonksiyonun yürütülmesi tamamlandıktan sonra bile dıştaki fonksiyona ait yerel değişkenleri "hatırlaması" durumunda oluşur.
İç fonksiyon, ortamını beraberinde taşır ve çağrılar arasındaki durumu korur:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Çıktı: 1
print(counter()) -- Çıktı: 2
print(counter()) -- Çıktı: 3createCounter() çağrıldığında, yerel bir count değişkeni oluşturur ve anonim bir fonksiyon döndürür. Döndürülen fonksiyon hala count değişkenine erişebilir; dış fonksiyonun yürütülmesi bittikten sonra bile o değişkeni "kapsar" (closes over).
Kendin dene
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Aşağıda çarpma fonksiyonunu kullanın
endBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1İleri Düzey Tablo Yineleme
pairs() ile Yinelemeipairs() ile Yinelemepairs() vs. ipairs()Özet - Karakter Sayfası2Daha Fazla Tablo Kütüphanesi Fonksiyonu
table.concat()Tablo Oluşturma ve unpack()table.sort()Fonksiyonlar ile Özel SıralamaÖzet - Yüksek Skor Tablosu3İleri Düzey Fonksiyon Kavramları
Birden Fazla Değer DöndürmeVariadic Fonksiyonlar (...)Birinci Sınıf Değer Olarak FonksiyonlarAnonim FonksiyonlarClosure Nedir?Özet - Basit Event Handler