Menu
Coddy logo textTech

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ı: 3

createCounter() ç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.

challenge icon

Görev

Kolay

Belirli 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:

  • createMultiplier içinde bir sayı parametresi alan iç içe geçmiş bir fonksiyon oluşturun
  • İç içe geçmiş fonksiyon, parametresini dış fonksiyondan gelen factor ile çarpmalıdır
  • İç içe geçmiş fonksiyon, factor değerini hatırlayarak bir closure (kapsam) oluşturacaktır
  • Çarpan fonksiyonunu number parametresi ile çağırın ve sonucu döndürün

Parametreler:

  • factor (sayı): Çarpan değeri
  • number (sayı): Çarpılacak sayı

Dönen Değer:

  • number'ın factor ile ç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ı: 3

createCounter() ç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

end
quiz iconKendini test et

Bu 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