Cyklus s ipairs

Projít seznam od prvního prvku k poslednímu je tak častý úkol, že na něj Lua má zkratku. Kromě číselného for, který znáte, existuje druhý druh cyklu for, který bere hodnoty z funkce. S funkcí ipairs prochází prvky seznamu:

local plodiny = {"mrkev", "brambory", "dýně"}
for i, plodina in ipairs(plodiny) do
    print(i, plodina)
end

Vypíše:

1	mrkev
2	brambory
3	dýně

První řádek čtěte takto: pro každý index i a prvek plodina ze seznamu plodiny udělej tohle. V každém průchodu vám cyklus dá dvě hodnoty: index a prvek na tomto indexu. Nemusíte psát plodiny[i], prvek už je v proměnné plodina. Název ipairs pochází z anglického index–value pairs, dvojice index a hodnota.

Stejně jako u číselného for existují obě proměnné jen uvnitř cyklu a můžete je pojmenovat, jak chcete. Dobrý název pro prvek je jednotné číslo názvu seznamu: plodina v plodiny, cena v ceny.

Index často nepotřebujete. Pak na jeho místo napište _ (podtržítko):

local plodiny = {"mrkev", "brambory", "dýně"}
for _, plodina in ipairs(plodiny) do
    print("Zalít: " .. plodina)
end

Vypíše:

Zalít: mrkev
Zalít: brambory
Zalít: dýně

_ je obyčejný název proměnné, ale programátoři v Lua ho používají pro hodnoty, které nepotřebují, takže každý, kdo kód čte, hned ví, že se index nepoužívá. Index ale nemůžete prostě vynechat. První proměnná dostane vždycky index, ať se jmenuje jakkoli:

local plodiny = {"mrkev", "brambory", "dýně"}
for plodina in ipairs(plodiny) do
    print(plodina)
end

Vypíše:

1
2
3

Proměnná plodina navzdory svému názvu dostala indexy. Další častá chyba je zapomenout ipairs. Cyklus čeká za in funkci, a místo ní dostane tabulku:

local plodiny = {"mrkev", "brambory", "dýně"}
for i, plodina in plodiny do
    print(plodina)
end
main.lua:2: attempt to call a table value (for iterator 'for iterator')

O ipairs je dobré vědět ještě dvě věci:

  • Zastaví se na prvním nil. V seznamu s dírou dojde jen k díře a prvky za ní přeskočí. To je další důvod, proč díry nenechávat.
  • Když do proměnné plodina přiřadíte novou hodnotu, změní se jen proměnná, ne seznam. Prvek změníte zápisem plodiny[i] = … jako v minulém cvičení.

Který cyklus tedy použít? ipairs, když procházíte seznam od začátku do konce, což je většinou. Číselný for, když potřebujete něco jiného, třeba jít pozpátku. V lekci o slovnících poznáte sourozence funkce ipairs, funkci pairs.

Pokyny

Napište cyklus s ipairs, který projde seznam vejce, s proměnnou den pro index a pocet pro prvek.

V cyklu vypište vejce z každého dne (ks znamená kusy):

Den 1: 4 ks
Den 2: 6 ks
Den 3: 5 ks
Den 4: 7 ks
Den 5: 3 ks
Den 6: 6 ks
Den 7: 5 ks

Pod něj napište druhý cyklus s ipairs přes vejce, s _ místo indexu. Spočítejte v něm dobré dny, kdy slepice snesly aspoň 6 vajec. (Počítadlo vytvořte před cyklem, jako v lekci o cyklech.)

Za cyklem vypište výsledek: Dobré dny: 3.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/11