Lua ¿Cómo crear una tabla dentro de una función?
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
- Si su función devuelve la
animal_soundstabla completa , aunque no es lo que se le pide, obtiene el sonido animal de la siguiente maneraprint(make_sound().cat):make_soundes 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ónmake_soundy laanimal_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 conlocal 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 def( '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' )
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.