Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: doga312 23. 02. 2023, 12:17:32
-
Ahoj,
předělávám si z BASHe do Lua zobrazování počasí a nedaří se mi rozchodit cyklus for:
#!/usr/bin/lua5.3
lunajson = require 'lunajson'
-- read local file
local open = io.open
local file = open("/home/doga/.conky/pocasi/compact.json")
if not file then return nil end
local jsonString = file:read "*a"
file:close()
local table = lunajson.decode(jsonString)
print(table.properties.timeseries[1].data.instant.details.air_temperature)
print(table.properties.timeseries[2].data.instant.details.air_temperature)
local teplota = {}
for t = 0,5 do
teplota[t] = table.properties.timeseries[t].data.instant.details.air_temperature
print(teplota[t])
end
hází to chybu:
5.5
6.3
/usr/bin/lua5.3: ./json9.lua:19: attempt to index a nil value (field '?')
stack traceback:
./json9.lua:19: in main chunk
[C]: in ?
Dík za pomoc
-
a víš, že lua indexuje pole od 1? asi by mělo být "for t=1,6".
Ta chybová hláška ti jasně říká, že index t není v poli nalezený, tj. nemáš správně ošetřený přístup k poli, to je asi hlavní příčina chyby. Netuším jaká máš vstupní data...
-
Dík, bylo to tou 0.
-
BTW když už tu je tolik odborníků na LUA, nemohl by někdo doporučit z toho milionu co jsou na netu k dispozici nějaký rozumný quick tutorial? To znamená žádné rozvláčné rozepisování (už vůbec ne video), ale základní principy jazyka, datové typy (třeba jako to jak tu padlo že pole jsou od jedné) a pár triviálních příkladů atd.
...zhruba ve formátu, jak tu pan Tišnovský občas popisuje různé exotické jazyky :)
-
BTW když už tu je tolik odborníků na LUA, nemohl by někdo doporučit z toho milionu co jsou na netu k dispozici nějaký rozumný quick tutorial? To znamená žádné rozvláčné rozepisování (už vůbec ne video), ale základní principy jazyka, datové typy (třeba jako to jak tu padlo že pole jsou od jedné) a pár triviálních příkladů atd.
...zhruba ve formátu, jak tu pan Tišnovský občas popisuje různé exotické jazyky :)
viz https://www.root.cz/clanky/programovaci-jazyk-lua/
-
BTW když už tu je tolik odborníků na LUA, nemohl by někdo doporučit z toho milionu co jsou na netu k dispozici nějaký rozumný quick tutorial? To znamená žádné rozvláčné rozepisování (už vůbec ne video), ale základní principy jazyka, datové typy (třeba jako to jak tu padlo že pole jsou od jedné) a pár triviálních příkladů atd.
...zhruba ve formátu, jak tu pan Tišnovský občas popisuje různé exotické jazyky :)
A nebo:
https://learnxinyminutes.com/docs/lua/ (https://learnxinyminutes.com/docs/lua/)
-
já se nejraději účím ze zdrojáků a testy přímo pro luu samotnou mi příjdou nejlepší https://github.com/lua/lua/tree/master/testes, hlavně vidím jak to autoři zamýšleli, co je pokryté a funguje v pořádku.
-
Docela by mě zajímalo, proč interpreter Lua, který je na světě tak dlouho, nedokáže vyplivnout smysluplnou chybovou hlášku pro tak jasný problém. :(
-
Inku, co ti je na hlášce
attempt to index a nil value (field '?')
nejasného?
Očekáváš snad že ti to napíše že se indexuje od 1? ;D
-
Docela by mě zajímalo, proč interpreter Lua, který je na světě tak dlouho, nedokáže vyplivnout smysluplnou chybovou hlášku pro tak jasný problém. :(
chyba "attempt to index a nil value" na řádku 19 mně příjde dostatečně vypovídající. Pokud prvek v poli neexistuje, vrací se nil, chyba odkazuje na to, že se snažím k přistupovat k atributu hodnoty nil.
Jak by podle tebe ta chyba měla znít? Vždyť interpret neví, jestli náhodou tam nedáváš pole, kde máš i prvek s indexem 0
-
Inku, co ti je na hlášce attempt to index a nil value (field '?')
nejasného?
Očekáváš snad že ti to napíše že se indexuje od 1? ;D
Ano, může napsat něco jako "Index out of range", co znamená v lidštině "index a nil value"?
-
jenže lua nevyhazuje chybu "out of rage" při přístupu k neexistujícímu prvku v poli, vrací pouze nil, když prvek neexistuje.
ta část "to index" v chybové hlášce je sloveso, říká, že nemůže přistoupit na nějaký prvek/vlastnost u typu "nil". Text v závorce "field '?'" mi zase říká, že prvek na který přistupuji není explicitně ve výrazu zadaný, ale pochází z proměnné, tady je jen proměnná t, takže viník je nalezen hned.
Když se kouknu do zdrojáku, tak tam je v řětězci několik volání atributů a indexů v poli v rámci výrazu "table.properties.timeseries[t].data.instant.details.air_temperature", jakýkoliv prvek v pořadí může neexistovat a vrátit hodnotu nil, pak bude i následný prvek uveden v chybě jakou hodnota field, programátor by to měl ověřovat a nespoléhat na správnou strukturu.
Lua je takhle navržena, s tímhle design vznikla a takhle funguje tak 30 let.
-
jenže lua nevyhazuje chybu "out of rage" při přístupu k neexistujícímu prvku v poli, vrací pouze nil, když prvek neexistuje.
OK, to se asi moc dobře řešit nedá. Dík za vysvětlení.