Lua - Yineleyiciler
Yineleyici, sözde koleksiyon veya konteynerin öğeleri arasında gezinmenizi sağlayan bir yapıdır. Lua'da bu koleksiyonlar genellikle dizi gibi çeşitli veri yapıları oluşturmak için kullanılan tablolara atıfta bulunur.
Yineleyici için Genel
Yineleyici için genel , koleksiyondaki her öğenin anahtar değer çiftlerini sağlar. Aşağıda basit bir örnek verilmiştir.
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
Yukarıdaki kodu çalıştırdığımızda, aşağıdaki çıktıyı alacağız -
1 Lua
2 Tutorial
Yukarıdaki örnek, Lua tarafından sağlanan varsayılan ipairs yineleyici işlevini kullanır .
Lua'da yineleyicileri temsil etmek için işlevleri kullanırız. Bu yineleyici işlevlerindeki durum bakımına bağlı olarak, iki ana türe sahibiz -
- Durumsuz Yineleyiciler
- Durum bilgili Yineleyiciler
Durumsuz Yineleyiciler
Adından da anlaşılacağı gibi, bu tür yineleyici işlevinin herhangi bir durumu korumadığını anlayabiliriz.
Şimdi, karelerini yazdıran basit bir işlevi kullanarak kendi yineleyicimizi oluşturmanın bir örneğini görelim. n sayılar.
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n)
end
Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız.
1 1
2 4
3 9
Yukarıdaki kod, yineleyicilerin ipairs işlevinin çalışma şeklini taklit etmek için biraz değiştirilebilir . Aşağıda gösterilmiştir.
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
function squares(iteratorMaxCount)
return square,iteratorMaxCount,0
end
for i,n in squares(3)
do
print(i,n)
end
Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız.
1 1
2 4
3 9
Durum bilgili Yineleyiciler
İşlev kullanan önceki yineleme örneği durumu korumaz. İşlev her çağrıldığında, işleve gönderilen ikinci bir değişkene dayalı olarak koleksiyonun sonraki öğesini döndürür. Mevcut elemanın durumunu tutmak için kapaklar kullanılır. Kapanış değişken değerlerini işlev çağrılarında korur. Yeni bir kapanış yaratmak için, kapanışın kendisi ve kapatmayı oluşturan bir fabrika dahil olmak üzere iki işlev yaratıyoruz.
Şimdi, kapanışları kullanacağımız kendi yineleyicimizi yaratmanın bir örneğini görelim.
array = {"Lua", "Tutorial"}
function elementIterator (collection)
local index = 0
local count = #collection
-- The closure function is returned
return function ()
index = index + 1
if index <= count
then
-- return the current element of the iterator
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız.
Lua
Tutorial
Yukarıdaki örnekte, elementIterator'ın, işlev her çağrıldığında dizini artırarak koleksiyondaki öğelerin her birini döndürmek için yerel harici değişkenler dizinini ve sayımını kullanan başka bir yöntemi olduğunu görebiliriz.
Yukarıda gösterildiği gibi kapama kullanarak kendi işlev yineleyicilerimizi oluşturabiliriz ve koleksiyon boyunca yinelediğimiz her seferde birden çok öğe döndürebiliriz.