Записи
До сих пор словари Эммы хранили много однотипных вещей: культуры и их количество, культуры и их цены. Но таблица может описывать и одну вещь несколькими значениями. Такую таблицу часто называют записью, а её ключи — полями:
local carrot = {name = "Морковь", days = 3, seedPrice = 2, sellPrice = 5}
print(carrot.name .. ", дней до урожая: " .. carrot.days)
print("Прибыль: " .. (carrot.sellPrice - carrot.seedPrice))Выведется:
Морковь, дней до урожая: 3
Прибыль: 3Это такая же таблица, как амбар, только используется она иначе. В амбаре ключи — это данные: Эмма может в любой момент добавить любую культуру. В записи ключи фиксированы и известны заранее. У каждой культуры есть name, days, seedPrice и sellPrice, и программа читает их через точку. Значения могут быть разных типов:
local bella = {name = "Белла", kind = "корова", age = 4, milked = false}
bella.milked = true
print(bella.name, bella.kind, bella.age, bella.milked)Белла корова 4 trueЗаписи хорошо сочетаются с функциями. Вместо того чтобы передавать название, дни и цены по отдельности, вы передаёте одну запись, а функция читает нужные поля:
local function profit(crop)
return crop.sellPrice - crop.seedPrice
end
local carrot = {name = "Морковь", days = 3, seedPrice = 2, sellPrice = 5}
local potato = {name = "Картофель", days = 4, seedPrice = 3, sellPrice = 8}
print(profit(carrot), profit(potato))3 5Функция может и создавать запись, и возвращать её. Когда нужно много записей одной формы, поля записываются только один раз, в функции:
local function newPlot(crop)
return {crop = crop, day = 0, watered = false}
end
local plot = newPlot("pumpkin")
print(plot.crop, plot.day, plot.watered)pumpkin 0 falsecrop = crop может показаться странным. Слева от = стоит ключ, поле crop. Справа — его значение: параметр crop, который в этом вызове хранит "pumpkin". Каждый вызов возвращает новую таблицу, поэтому у каждой грядки свои поля.
Типичная ошибка — опечатка в названии поля. Lua не проверяет названия полей, поэтому carrot.sellprice (со строчной p) — это просто nil, а вычисления с ним заканчиваются ошибкой attempt to perform arithmetic on a nil value (field 'sellprice'). Когда в ошибке вы видите field '…', сравните название в сообщении с названием в таблице.
Задание
- 1
Напишите функцию
describe(crop), которая возвращает (а не выводит) строку о полученной культуре вместе с её прибылью: цена продажи минус цена семян. Выведитеdescribe(pumpkin):Тыква, дней: 7, прибыль: 15 - 2
Ниже создайте запись
strawberryс теми же четырьмя полями, что и у тыквы: название"Клубника", 5 дней, семена за 4 монеты и цена продажи 12 монет. Выведите её описание:Клубника, дней: 5, прибыль: 8 - 3
Напишите функцию
newCrop(name, days, seedPrice, sellPrice), которая возвращает новую запись с этими четырьмя полями. Создайте с её помощью кукурузу: 6 дней, семена за 3 монеты, цена продажи 10 монет. Выведите её описание:Кукуруза, дней: 6, прибыль: 7