# Concepts - Iterators

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/iterators
- **Çeviri tarihi:** 2026-03-04

Başlık Tag (Anlaşmalar - İteratörler)

## İteratör nedir?

Çok basitçe, bir iterator bir function that değerler topluluğundaki bir sonraki değeri bir de kullanmak için alır.`for`Bir iteratörün hızlı bir şekilde öğrendiğiniz bir örneği [çiftler](https://gmod.tr/wiki/Global.pairs)İterator fonksiyonu.

### Örnek

```lua
local some_table = {
1, 2, nil, 4, 5
}
for k, v in pairs(some_table) do
print(v)
end
---
--- Çıkışlar:
--- 1
--- 2
--- 4
--- 5
```

### Çıkıştırma çiftleri

Neyi daha iyi anlamamıza yardımcı olmak için `for`Aslında içsel olarak yapar, bu çiftlerin bir içine sarılmasının bir örneğidir.`while`Çubuk içinde.`for`Loop, aşağıda görüldüğü gibi değerlerin kendileri üzerinde çalışmaktan başka her şey sizin için işlenir.

```lua
local t = {"a", "b", "c", "d", "e"}
--- Bu aslında bir for döngüsünün içeride yaptığı şey .
--- İlk olarak, tekrarlayıcı fonksiyonunuzdan değerleri geri alır
--- Bu her zaman bir işlev, veriler ve anahtar olmalıdır (kontrol)
local fn, data, k = pairs(t)

--- Bir sonraki, geri gönderilenleri çağırırız. Artık yapamayız.
while true do
local v

	--- Ardından, anahtarın ilk geri dönüşü olduğunu varsayıyoruz
--- döndürülen fonksiyon, hangi çiftleri geçersiz kılıyoruz
--- İlk bir tane olduğunu düşünmüştüm
	k, v = fn(data, k)

	if not k then break end
--- Son olarak, burada değerlerle gerçekten bir şeyler yapıyoruz.
--- Yapmak ve bitmek arasında bir for döngüsünde aynı
print(k, v)
end
--- Çıkış:
--- 1 a
--- 2 b
--- 3c
--- 4 d
--- 5e
```

## Kendi kitabımı nasıl yazacağım?

İteratörler biraz `for`sihir ve bir [fonksiyon](https://gmod.tr/wiki/function)Başka bir şey getirir .[fonksiyon](https://gmod.tr/wiki/function)İki aşamaya bölünmüştür.

Diyelim ki bu örnek için, bir [ip](https://gmod.tr/wiki/string)

### Adım 1 - Başlatma

Önce jeneratörümüzü tanımlıyoruz.[fonksiyon](https://gmod.tr/wiki/function)Bu bizim iteratörümüz olarak hareket edecek.`pairs`

```lua
function strchars(str) --- Bu bizim "mükemmel" veya "generator" fonksiyonumuz, yeni iterasyonlar üreten
- İşimiz burada .
end
```

Sonrasında, olayları iki şekilde halledebiliriz, ya kendi "devletimizi" ele alabiliriz ya da Lua'nın bizim için tekrar devleti ele almasına izin verebiliriz.

> **NOT:** İteratörün şu anda nerede olduğunu hatırlamak için sakladığımız verilerle ilgili.

### Adım 2.a - Kendi devletimizi yönetmek

Kendi durumumuzu halletmek istiyorsak, onu bu şekilde tanımlarız.
Kendi durumumuzu yönetmek bazı avantajları ve bazı dezavantajları ile birlikte gelir. En büyük avantajlardan biri, durumumuzun jeneratörümüz tarafından gönderilen ilk değerin olması gerekmez.

```lua
function strchars(str)
	- Önce tüm eyaletimizi ilan ediyoruz.
local index = 1 --- Sınır indeksleri [1], bu yüzden buradan başlıyoruz.
--- Bir sonraki, yeni bir function that geri vereceğiz bize verilerimizi alacak
--- Bu değerlerden geri dönüş değerleri , for döngüsündeki argümanlara aktarılır .
--- Eğer sıfır döndürürsek, döngü hemen durur.
return function()
		index = index + 1
if str[index] == "" then - Bir dizinin indeksi hiçbir zaman sıfır göndermediğinden, bu sonuna ulaştığımızı kontrol ediyor.
return
end
--- Burada ilk değeri ve ikinci indeksiyi iade ettiğimize dikkat edin!
--- Bu, çiftlerin yapma yönteminin tersine.
Bunu sadece kendi devletimizi yöneterek yapabiliriz .
return str[index], index
	end
end
for char, i in strchars("abc") do
print(char, i)
end
---
--- Çıkışlar:
--- a 1
--- b 2
--- c 3
```

### Adım 2.b - Lua devletimizi ele alıyor

Eğer Lua'nın bizim için durumumuzu yönlendirmesine izin vermek istiyorsak jeneratörümüzden gönderilen ilk değerin bizim durumumuz olması gerektiğini unutmamalıyız, aksi takdirde atılacak.

```lua
function strchars(str)
	--- Burada, ambalajda hiçbir şey açıklamayız ve yeni bir fonksiyon oluştururuz
--- Lua , jeneratörümüzden ilk gönderilen değerin function is durum değerimizin olduğunu varsayıyor .
--- bu yüzden bunu kolaylaştırmak için içerdiği özelliklere sahip .
return function(_, index) --- Burada geçen ilk argüman "Esoterik Bilgiler"de ayrıntılı olarak açıklanmıştır.
		index = index + 1
if str[index] == "" then return end
--- Önceki fonksiyonun aksine , indeksi ilk olarak iade ediyorlardı çünkü Lua'nın devlet kontrol değeri olmasını beklediği şey bu .
--- Burada gönderilen ilk değer bu function as indeksine aktarılır
return index, str[index]
end
end
for i, char in strchars("abc") do
print(i, char)
end
---
--- Çıkışlar:
--- 1 a
--- 2b
--- 3c
```

## Esoterik Bilgiler

İteratörden sonra geçilebilecek ek değerler vardır function call `for in`Çubuklar.

### "Değişmeyen Bir Devlet"

İteratörden sonra function in a `for in`Loop, olarak adlandırılan bir şey sağlayabilirsiniz.["değişmeyen durum"](https://www.lua.org/pil/7.2.html)Temel olarak bu **sabit**function the iterator jeneratörünün geri dönüşleri için ilk argüman olarak geçerli olan veriler.
Bu birkaç nedenden ötürü faydalıdır, öncelikle, iyi tanımlanmış bir fonksiyonumuz varsa tamamen bir jeneratör oluşturmayı atlayabiliriz.

```lua
--- Bu function is doğrudan ve bir jeneratörden değil çağrı için inşa edildiğinden
--- İki argümanı kabul ediyoruz, bazı verileri ve bazı indeksi
--- Bu function is adım 2.b'de oluşturulan kodla neredeyse aynı, ancak Lua'ya verilerimizi ve durum endeksimizi yönetmemize izin veririz.
function strchars(str, index)
	index = index or 0 --- Endeks sıfırdan başlıyor, bu yüzden varsayılanı 0'ya göndeririz.
	index = index + 1 Sonra bir tane ekliyoruz.
if str[index] == "" then return end --- Bir kez iptal edildi
return index, str[index]
end
--- Bir function for ilk değer olarak adlandırmak yerine, doğrudan kapalı jeneratör fonksiyonumuzu kullanırız
--- Strchars'tan sonra ikinci bir ifade de veriyoruz, bu bizim değişmez durumumuzdur.
for i, ch in strchars, "abc" do
print(i, ch)
end
---
--- Çıkışlar:
--- 1 a
--- 2b
--- 3c
```

### "Kontrol Değişkili"

Değişmeyen durumumuzun ardından, bir "kontrol değişkeni" sağlayabiliriz, bu başlangıç indeks değişkeni!

```lua
--- "Invariant State" strchars'ı kullanan notlar
--- Yukarıdaki gibi, kapalı olmayan jeneratörümüzü function with bir ipin değişmez durumunu adlandırabiliriz.
--- Bununla birlikte, 1'in son parametreyi de geçiyoruz.
--- Bu ilk çağrıda başlangıç indeksimiz olarak strchars'a aktarılır.
for i, ch in strchars, "abc", 1 do
print(i, ch)
end
---
--- Çıkışlar:
--- 2 b
--- 3c
```

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/iterators
