Lua Como criar uma tabela dentro de uma função?
Sou iniciante em Lua e programação em geral (tenho alguma experiência em outras linguagens, mas nada muito grande) e tenho seguido um tutorial onde há um exercício sobre tabelas:
"Faça uma função com uma tabela nela, em que cada tecla na tabela seja o nome de um animal. Dê a cada tecla um valor igual ao som que o animal faz e retorne o som do animal. Tente invocar a função e veja se você retorna o som correto. "
Esta é minha solução atual:
make_sound = function(input)
animal_sounds = {
["cat"] = "meow",
["dog"] = "woof"
}
return animal_sounds.input
end
print(make_sound("cat"))
Isso apenas imprime 'nil'. Eu tentei muitas variações disso, mas todas elas imprimem 'nil' também ou me dão um erro dizendo algo sobre nil (desculpe, não consigo me lembrar da mensagem original ou do código errado).
Eu sei que esta é uma pergunta realmente estúpida e provavelmente tem uma resposta extremamente básica, então sinto muito pela minha estupidez. Todos os outros exercícios foram moles e, de repente, fui atingida por essa coisa por uma hora. Pesquisei em todos os lugares, mas só consegui encontrar resultados sobre funções dentro de arrays ou algo completamente diferente. Eu não queria desistir de uma tarefa aparentemente fácil, então aqui estou ...
Respostas
- Se a sua função retornar a
animal_soundstabela inteira , embora não seja o que é pedido a você, você obtém o som do animalprint(make_sound().cat):make_soundé uma função,make_sound()retorna uma mesa,make_sound()['cat']é um campo dessa tabela,- e
make_sound().caté um açúcar sintático para ele, como foi dito na resposta acima.
- Além disso, é melhor declarar tudo
local, incluindo funçãomake_soundeanimal_soundstabela. - E você pode pular
[""]/['']nas chaves da tabela, se forem strings de latim básico, números e sublinhados:cat = 'mew'não['cat'] = 'mew'. - A menos que você vá usar
make_soundcomo uma variável, é melhor declará-la com alocal functionsintaxe, em vez de uma atribuição. - Você pode pular os parênteses em torno da única string ou parâmetro de tabela na chamada de função: em
f'str'vez def( 'str' ). - Mais importante ainda, sua função nunca usa
input, o que se supõe ser o animal. Portanto, não deve ser devolvida a mesa, mas sim o som. Então, mova a[]parte dentro da função.
Então:
local function make_sound( input )
local animal_sounds = {
cat = 'meow',
dog = 'woof',
cow = 'moo'
}
return animal_sounds[input]
end
print( make_sound 'cat' )
PS Você pode até tornar a tabela anônima, embora ela precise ser cercada por parênteses, caso contrário Lua pensará que returnnão é o último operador antes, endcomo deveria ser:
local function make_sound( input )
return ({
cat = 'meow',
dog = 'woof',
cow = 'moo'
})[input]
end
print( make_sound 'cat' )
Experimente isto:
return animal_sounds[input]
O animal_sounds.inputé equivalente a animal_sounds["input"]e sua tabela não tem a "input"chave, portanto, ele retorna nil.