Closure Nedir?
Coddy'nin Lua Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 14 / 54.
Fonksiyonların değişkenlerde saklanabildiğini, bağımsız değişken olarak geçirilebildiğini ve diğer fonksiyonlardan döndürülebildiğini öğrendin. Şimdi bunun en güçlü sonuçlarından birini, closure’ları inceleyeceğiz.
Bir closure, iç içe geçmiş bir fonksiyonun, dışındaki fonksiyonun yerel değişkenlerini, dıştaki fonksiyonun çalışmasını tamamlamasından sonra bile “hatırlaması” durumunda ortaya çıkar. Bu ilk başta kulağa tuhaf gelebilir: Onu oluşturan fonksiyon tamamlandıktan sonra bir değişken nasıl hâlâ 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 işlev döndürür. Normalde, createCounter() tamamlandığında count değişkeninin ortadan kalkmasını beklersiniz. Ancak döndürülen işlev hâlâ count değişkenine erişebilir. Bu işlev, söz konusu değişkeni “kapsar”.
counter() işlevini her çağırdığınızda, createCounter() ilk kez çalıştırıldığında oluşturulan aynı count değişkenine erişir ve onu değiştirir. İç işlev, ortamını beraberinde taşır ve çağrılar arasındaki durumu korur.
Görev
KolayBelirli bir çarpanla çarpan bir işlev oluşturan ve ardından bunu verilen bir sayıyı çarpmak için hemen kullanan createMultiplier işlevini yazın.
Mantık:
createMultiplieriçinde bir sayı parametresi alan iç içe bir işlev oluşturun- İç içe işlev, parametresini dış işlevdeki
factorile çarpmalıdır - İç içe işlev,
factordeğerini hatırlayan bir kapanım oluşturur - Çarpan işlevini
numberparametresiyle çağırın ve sonucu döndürün
Parametreler:
factor(number): Çarpan değerinumber(number): Çarpılacak sayı
Döndürür:
numberilefactordeğerinin çarpılmasının sonucu (number)
Kendin dene
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Aşağıda multiply fonksiyonunu kullan
endBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış 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 HandlerKendi başına pratik yap: Online Lua derleyicisi