Ключи в переменных
Ключ в квадратных скобках не обязательно писать прямо в них. Он может лежать в переменной, прийти из параметра или из цикла:
local prices = {carrot = 5, potato = 8, strawberry = 12}
local crop = "potato"
print(prices[crop])Выведется:
8Сначала Lua заглядывает в переменную crop, находит там строку "potato" и только потом читает значение по этому ключу. Так пишут код для ключа, который неизвестен в момент написания программы: для культуры, которую просит покупатель, или для каждой культуры из списка.
А теперь классическая ошибка. После точки всегда идёт сам ключ, а не переменная. prices.crop означает prices["crop"]: ключ — это строка "crop", а такого ключа в таблице нет:
local prices = {carrot = 5, potato = 8, strawberry = 12}
local crop = "potato"
print(prices.crop)
print(prices["crop"])
print(prices[crop])Выведется:
nil
nil
8Итак: если вы знаете ключ, когда пишете код, ставьте точку (prices.potato). Если ключ лежит в переменной, используйте квадратные скобки без кавычек (prices[crop]). С кавычками это снова просто строка: prices["crop"] — то же самое, что prices.crop.
Ключи в переменных особенно полезны в функциях и циклах. Эта функция работает для любой культуры, даже для той, которую вы позже добавите в таблицу:
local prices = {carrot = 5, potato = 8, pumpkin = 20}
local function priceOf(crop, amount)
return prices[crop] * amount
end
print(priceOf("carrot", 3))
print(priceOf("pumpkin", 2))Выведется:
15
40Если бы вы по ошибке написали в ней prices.crop * amount, программа закончилась бы ошибкой attempt to perform arithmetic on a nil value (field 'crop'). В сообщении назван ключ, который искала Lua, — 'crop': это признак того, что вы написали имя переменной вместо её значения. А если ключа из переменной в таблице нет, в сообщении вместо имени стоит вопросительный знак, потому что Lua не знает, откуда взялся ключ: priceOf("corn", 1) заканчивается ошибкой attempt to perform arithmetic on a nil value (field '?').
И ещё одна деталь: ключом может быть и число, а число — это совсем другой ключ, чем строка. t[1] и t["1"] — два разных ключа.
Задание
- 1
Программа заканчивается ошибкой. Исправьте функцию
priceOfтак, чтобы она читала цену культуры из параметраcrop. Тогда программа выведет:3 моркови: 15 монет - 2
Покупатель принёс список того, что хочет, —
order: по одной штуке каждой культуры. В конце программы пройдите по нему черезipairsи выведите цену каждой культуры. Кукурузу Эмма на прилавке не продаёт (она оставляет её для кур), поэтому вpricesнет ключа"corn": для неё выведитеcorn: не продаётся. Программа выводит:pumpkin: 20 strawberry: 12 corn: не продаётся carrot: 5 - 3
Под циклом выведите, сколько покупатель заплатит за те культуры, которые Эмма продаёт:
Итого: 37 монет