resume ve yield
Coddy'nin Lua Journey'sinin Logic & Flow bölümünün bir parçası — ders 51 / 54.
Önceki derste, bir coroutine'in coroutine.yield() kullanarak ana koda nasıl değer döndürebileceğini öğrendiniz. Ancak iletişim her iki yönde de akabilir. Bir coroutine'i devam ettirdiğinizde (resume), coroutine'in içine de değerler gönderebilirsiniz.
coroutine.resume() işlevini coroutine nesnesinden sonra ek argümanlarla çağırdığınızda, bu argümanlar coroutine'e aktarılır. Coroutine içinde bu değerler, onu duraklatan coroutine.yield() çağrısının dönüş değerleri haline gelir.
İşte şu şekilde çalışır:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- yield kısmında başlar ve duraklar
coroutine.resume(co, "Hello") -- Coroutine içine "Hello" değerini iletirCoroutine ikinci kez devam ettiğinde, "Hello" dizesi içeri aktarılır ve coroutine.yield() fonksiyonunun dönüş değeri haline gelerek value değişkeninde saklanır.
Görev
KolayinitialMessage parametresini alan ve ana kod ile bir coroutine (eşyordam) arasındaki iki yönlü iletişimi gösteren bir dize döndüren createEchoCoroutine fonksiyonunu yazın.
Önce initialMessage değerini yield eden, ardından devam ettirildiğinde (resumed) bir yanıt alan ve son olarak bu yanıtı tekrar yield eden bir coroutine oluşturun. Fonksiyon, değerlerin hem coroutine dışına hem de içine aktarılmasını göstermelidir.
Mantık:
initialMessagedeğerini yield eden ve bu yield işleminden dönen değeri saklayan bir fonksiyon oluşturun- Değeri aldıktan sonra, onu tekrar dışarıya yield edin
- Bu fonksiyonu
coroutine.create()kullanarak bir coroutine içine sarın - Başlangıç mesajını almak için coroutine'i ilk kez resume edin
- Coroutine'i ikinci kez resume edin ve içeriye
"Response"değerini geçirin - İkinci resume işleminden yield edilen değeri yakalayın
- Şu formatta bir dize döndürün:
First: [first_yield]\nSecond: [second_yield]
Parametreler:
initialMessage(string): Coroutine'in ilk olarak yield edeceği mesaj
Döndürür: Her iki yield edilen değeri bir yeni satırla ayrılmış şekilde gösteren bir dize (string). Format: First: Hello\nSecond: Response
Kopya kağıdı
Bir coroutine'i (eş yordamı) devam ettirirken, coroutine.resume() fonksiyonuna ek argümanlar geçirerek ona değerler gönderebilirsiniz. Bu argümanlar, coroutine'i duraklatan coroutine.yield() çağrısının dönüş değerleri haline gelir.
function receiver()
local value = coroutine.yield() -- Duraklar ve girdi bekler
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Coroutine'i başlatır, yield kısmında duraklar
coroutine.resume(co, "Hello") -- Coroutine içine "Hello" değerini geçirirCoroutine ikinci kez devam ettiğinde, "Hello" içeri aktarılır ve coroutine.yield() fonksiyonunun dönüş değeri olur; bu değer de value değişkeninde saklanır.
Kendin dene
function createEchoCoroutine(initialMessage)
-- Kodu buraya yazın
end
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
1İleri Düzey Tablo Yineleme
pairs() ile Yinelemeipairs() ile Yinelemepairs() vs. ipairs()Özet - Karakter Sayfası2Daha Fazla Tablo Kütüphanesi Fonksiyonu
table.concat()Tablo Oluşturma ve unpack()table.sort()Fonksiyonlar ile Özel SıralamaÖzet - Yüksek Skor Tablosu3İleri Düzey Fonksiyon Kavramları
Birden Fazla Değer DöndürmeVariadic Fonksiyonlar (...)Birinci Sınıf Değer Olarak FonksiyonlarAnonim FonksiyonlarClosure Nedir?Özet - Basit Event Handler9Yeni Başlayanlar İçin Coroutine'ler
Coroutine Nedir?coroutine create ve resumecoroutine.yield() ile Duraklatmaresume ve yieldCoroutine Durumunu Kontrol EtmeÖzet - Sayı ÜreticiÖzet - Vektör Matematiği