首页 > 解决方案 > Lua 如何在函数内部创建表?

问题描述

我是 Lua 和一般编程的初学者(我在其他语言方面有一些经验,但没什么大不了的),我一直在关注一个教程,其中有一个关于表格的练习:

“创建一个包含表格的函数,其中表格中的每个键都是动物名称。给每个键一个等于动物发出的声音的值并返回动物的声音。尝试调用该函数,看看你是否返回正确的声音。”

这是我目前的解决方案:

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

return animal_sounds.input

end

  print(make_sound("cat"))

这只是打印'nil'。我已经尝试了很多变体,但它们要么打印'nil',要么给我一个关于nil的错误信息(对不起,我不记得原始消息或错误代码)。

我知道这是一个非常愚蠢的问题,并且可能有一个非常基本的答案,所以我为我的愚蠢感到抱歉。所有其他练习都轻而易举,然后我突然被这个东西打了一个小时。我到处搜索,但只能找到有关数组内部函数或其他东西的结果。我不想放弃看似简单的任务,所以我在这里......

标签: lua

解决方案


  • 如果您的函数返回整个animal_sounds表格,尽管这不是您所要求的,但您可以通过以下方式获得动物声音print(make_sound().cat)
    • make_sound是一个函数,
    • make_sound()返回一个表,
    • make_sound()['cat']是该表的一个字段,
    • 并且make_sound().cat是它的语法糖,如上面的答案所述。
  • 此外,最好声明所有内容local,包括函数make_soundanimal_sounds表。
  • 如果它们是基本拉丁文、数字和下划线的字符串,您可以跳过[""]/在表键中: not 。['']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' )

推荐阅读