Concepts - Iterators

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.forBir iteratörün hızlı bir şekilde öğrendiğiniz bir örneği çiftlerİterator fonksiyonu.

Örnek

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 forAslında içsel olarak yapar, bu çiftlerin bir içine sarılmasının bir örneğidir.whileÇubuk içinde.forLoop, aşağıda görüldüğü gibi değerlerin kendileri üzerinde çalışmaktan başka her şey sizin için işlenir.

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 forsihir ve bir fonksiyonBaşka bir şey getirir .fonksiyonİki aşamaya bölünmüştür.

Diyelim ki bu örnek için, bir ip

Adım 1 - Başlatma

Önce jeneratörümüzü tanımlıyoruz.fonksiyonBu bizim iteratörümüz olarak hareket edecek.pairs

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.

İ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.

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.

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 inLoop, olarak adlandırılan bir şey sağlayabilirsiniz."değişmeyen durum"Temel olarak bu sabitfunction 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.

--- 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!

--- "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

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord