Lua Как создать таблицу внутри функции?

Sep 29 2020

Я новичок в Lua и программировании в целом (у меня был некоторый опыт работы с другими языками, но ничего особенного), и я следил за учебником, в котором есть одно упражнение на таблицах:

«Создайте функцию с таблицей в ней, где каждый ключ в таблице - это имя животного. Присвойте каждому ключу значение, равное звуку, издаваемому животным, и верните звук животного. Попробуйте вызвать функцию и посмотрите, вернете ли вы правильный звук ".

Вот мое текущее решение:

make_sound = function(input)
  animal_sounds = {
    ["cat"] = "meow",
    ["dog"] = "woof"
  }

return animal_sounds.input

end

  print(make_sound("cat"))

Это просто выводит «ноль». Я пробовал так много вариантов этого, но все они либо тоже печатают «nil», либо выдают ошибку, говоря что-то о nil (извините, я не могу вспомнить исходное сообщение или ошибочный код).

Я знаю, что это действительно глупый вопрос и, вероятно, на него есть очень простой ответ, поэтому я прошу прощения за свою глупость. Все остальные упражнения были пустяком, а потом я внезапно получил это занятие на час. Я искал везде, но смог найти результаты только о функциях внутри массивов или о чем-то еще. Я не хотел просто отказываться от, казалось бы, легкой задачи, поэтому я здесь ...

Ответы

1 AlexanderMashin Sep 28 2020 at 23:24
  • Если ваша функция возвращает всю 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' )
Doj Sep 28 2020 at 22:43

Попробуй это:

return animal_sounds[input]

animal_sounds.inputЭквивалентно animal_sounds["input"]и ваша таблица не имеет "input"ключа, поэтому он возвращается nil.