Lua 如何在函数内创建一个表格?

我是一个Lua的初学者,也是编程的新手(我在其他语言上有一些经验,但不是很多)。我一直在跟随教程学习表格,其中有一个练习:

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

这是我的目前的解决方案:

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

return animal_sounds.input

end

  print(make_sound("cat"))

这只会打印“nil”。我尝试过很多变化,但它们都会打印“nil”,或者给我一个关于nil的错误(抱歉,我无法记住原始消息或错误代码)。

我知道这是一个非常愚蠢的问题,可能有一个极其基本的答案,所以对于我的愚蠢,我感到很抱歉。所有其他的练习都很轻松,然后我突然被这个“简单”的任务卡住了一个小时。我到处搜索,但只能找到有关数组内部函数或其他完全不同的东西的结果。我不想放弃这个看起来容易的任务,所以我在这里...

点赞
用户11695625
用户11695625

尝试这样做:

返回 animal_sounds[input]

animal_sounds.input 等同于 animal_sounds["input"],而你的表格中没有"input"键,因此它返回 nil

2020-09-28 15:43:29
用户6632736
用户6632736

如果您的函数返回整个 animal_sounds 表格,虽然这不是要求您完成的任务,但可以通过 print(make_sound().cat) 获得动物的声音:

  • make_sound 是一个函数,
  • make_sound() 返回一个表格,
  • make_sound()['cat'] 是该表格的一个字段,
  • make_sound().cat 是其语法糖,正如上面的答案所述。

此外,最好将所有内容都声明为 local,包括函数 make_soundanimal_sounds 表格。如果表格键是基本拉丁字母、数字和下划线的字符串,则可以跳过 [""]/['']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' )

P.S. 您甚至可以使表格匿名,但它需要用括号括起来,否则 Lua 将认为 return 不是应该在 end 之前的最后一个操作符:

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

print( make_sound 'cat' )
2020-09-28 16:24:32