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.