Lua Como criar uma tabela dentro de uma função?

Sep 29 2020

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

1 AlexanderMashin Sep 28 2020 at 23:24
  • 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 animal print(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ção make_sounde animal_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 a local 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 de f( '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' )
Doj Sep 28 2020 at 22:43

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.