Lua Как создать таблицу внутри функции?
Я новичок в Lua и программировании в целом (у меня был некоторый опыт работы с другими языками, но ничего особенного), и я следил за учебником, в котором есть одно упражнение на таблицах:
«Создайте функцию с таблицей в ней, где каждый ключ в таблице - это имя животного. Присвойте каждому ключу значение, равное звуку, издаваемому животным, и верните звук животного. Попробуйте вызвать функцию и посмотрите, вернете ли вы правильный звук ".
Вот мое текущее решение:
make_sound = function(input)
animal_sounds = {
["cat"] = "meow",
["dog"] = "woof"
}
return animal_sounds.input
end
print(make_sound("cat"))
Это просто выводит «ноль». Я пробовал так много вариантов этого, но все они либо тоже печатают «nil», либо выдают ошибку, говоря что-то о nil (извините, я не могу вспомнить исходное сообщение или ошибочный код).
Я знаю, что это действительно глупый вопрос и, вероятно, на него есть очень простой ответ, поэтому я прошу прощения за свою глупость. Все остальные упражнения были пустяком, а потом я внезапно получил это занятие на час. Я искал везде, но смог найти результаты только о функциях внутри массивов или о чем-то еще. Я не хотел просто отказываться от, казалось бы, легкой задачи, поэтому я здесь ...
Ответы
- Если ваша функция возвращает всю
animal_soundsтаблицу , хотя это не то, что от вас требуется , вы получите звук животного следующим образомprint(make_sound().cat):make_soundэто функция,make_sound()возвращает таблицу,make_sound()['cat']поле этой таблицы,- и
make_sound().catявляется для него синтаксическим сахаром, как сказано в ответе выше.
- Также лучше объявить все
local, включая функциюmake_soundиanimal_soundsтаблицу. - И вы можете пропускать
[""]/['']вставлять ключи таблицы, если они представляют собой строки из базовой латиницы, чисел и символов подчеркивания:cat = 'mew'нет['cat'] = 'mew'. - Если вы не собираетесь использовать
make_soundв качестве переменной, лучше объявить ее с помощьюlocal functionсинтаксиса, а не присваивания. - Вы можете пропустить круглые скобки вокруг единственного параметра строки или таблицы в вызове функции:
f'str'вместоf( 'str' ). - Что еще важнее, ваша функция никогда не использует
input, а это должно быть животное. Следовательно, он должен возвращать не стол, а звук. Итак, переместите[]деталь внутрь функции.
Так:
local function make_sound( input )
local animal_sounds = {
cat = 'meow',
dog = 'woof',
cow = 'moo'
}
return animal_sounds[input]
end
print( make_sound 'cat' )
PS Вы даже можете сделать таблицу анонимной, хотя ее нужно будет заключить в круглые скобки, иначе Lua будет думать, что returnэто не последний оператор перед тем, endкак это должно быть:
local function make_sound( input )
return ({
cat = 'meow',
dog = 'woof',
cow = 'moo'
})[input]
end
print( make_sound 'cat' )
Попробуй это:
return animal_sounds[input]
animal_sounds.inputЭквивалентно animal_sounds["input"]и ваша таблица не имеет "input"ключа, поэтому он возвращается nil.