【问题标题】:Lua How to create a table inside a function?Lua 如何在函数内部创建表?
【发布时间】:2021-01-14 05:19:51
【问题描述】:

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

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

这是我目前的解决方案:

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

return animal_sounds.input

end

  print(make_sound("cat"))

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

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

【问题讨论】:

    标签: lua


    【解决方案1】:
    • 如果你的函数返回整个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' )
    

    PS 你甚至可以使表格匿名,尽管它需要用括号括起来,否则 Lua 会认为 return 不是 end 之前的最后一个运算符,因为它应该是:

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

    【讨论】:

      【解决方案2】:

      试试这个:

      return animal_sounds[input]
      

      animal_sounds.input 等效于 animal_sounds["input"],并且您的表没有 "input" 键,因此它返回 nil

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-02
        • 2017-02-09
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多