Lua ¿Cómo crear una tabla dentro de una función?

Sep 29 2020

Soy un principiante en Lua y en programación en general (he tenido algo de experiencia en otros lenguajes pero nada enorme) y he estado siguiendo un tutorial donde hay este ejercicio en tablas:

"Cree una función con una tabla en ella, donde cada tecla de la tabla sea un nombre de animal. Asigne a cada tecla un valor igual al sonido que hace el animal y devuelva el sonido del animal. Intente invocar la función y vea si recupera el sonido correcto ".

Aquí está mi solución actual:

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

return animal_sounds.input

end

  print(make_sound("cat"))

Esto solo imprime 'cero'. Probé tantas variaciones de esto, pero todas imprimen 'nil' también o me dan un error al decir algo sobre nil (lo siento, no puedo recordar el mensaje original o el código erróneo).

Sé que esta es una pregunta realmente tonta y probablemente tiene una respuesta extremadamente básica, así que lamento mi estupidez. Todos los demás ejercicios han sido muy sencillos y luego, de repente, me golpean con esta cosa durante una hora. Busqué en todas partes, pero solo pude encontrar resultados sobre funciones dentro de matrices o algo más por completo. No quería renunciar a una tarea aparentemente fácil, así que aquí estoy ...

Respuestas

1 AlexanderMashin Sep 28 2020 at 23:24
  • Si su función devuelve la animal_soundstabla completa , aunque no es lo que se le pide, obtiene el sonido animal de la siguiente manera print(make_sound().cat):
    • make_sound es una función,
    • make_sound() devuelve una tabla,
    • make_sound()['cat'] es un campo de esa mesa,
    • y make_sound().cates azúcar sintáctico para él, como se dice en la respuesta anterior.
  • Además, es mejor declarar todo local, incluida la función make_soundy la animal_soundstabla.
  • Y puede omitir [""]/ ['']en las teclas de la tabla, si son cadenas de latín básico, números y guiones bajos: cat = 'mew'no ['cat'] = 'mew'.
  • A menos que la vaya a utilizar make_soundcomo variable, es mejor declararla con local functionsintaxis, en lugar de una asignación.
  • Puede omitir los paréntesis alrededor de la única cadena o parámetro de tabla en la llamada a la función: en f'str'lugar de f( 'str' ).
  • Lo más importante es que su función nunca usa input, que se supone que es el animal. Por lo tanto, tiene que devolver no la mesa, sino el sonido. Entonces, mueva la []parte dentro de la función.

Entonces:

local function make_sound( input )
    local animal_sounds = {
        cat = 'meow',
        dog = 'woof',
        cow = 'moo'
    }
    return animal_sounds[input]
end

print( make_sound 'cat' )

PD Incluso puede hacer que la tabla sea anónima, aunque deberá estar entre paréntesis, de lo contrario, Lua pensará que returnno es el último operador antes, endcomo debería 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

Prueba esto:

return animal_sounds[input]

El animal_sounds.inputes equivalente a animal_sounds["input"]y su tabla no tiene la "input"clave, por lo tanto, regresa nil.