Function 尝试在Lua中调用函数时出现Nil错误
我犯了一个奇怪的错误,这是我一生都无法克服的 我正在编写一个纸牌游戏,我有两张不同长度的桌子。一个将条目链接到函数,另一个持有已玩的卡。第一个表是牌组中某些牌的属性Function 尝试在Lua中调用函数时出现Nil错误,function,lua,lua-table,Function,Lua,Lua Table,我犯了一个奇怪的错误,这是我一生都无法克服的 我正在编写一个纸牌游戏,我有两张不同长度的桌子。一个将条目链接到函数,另一个持有已玩的卡。第一个表是牌组中某些牌的属性 ATTRIBUTES = { Reset = RuleBook.Do_Reset, Go_Lower= RuleBook.Do_Go_Lower, Mirror = RuleBook.Do_Mirror} 这些函数的调用方式如下所示: ATTRIBUTES[cardPile
ATTRIBUTES = {
Reset = RuleBook.Do_Reset,
Go_Lower= RuleBook.Do_Go_Lower,
Mirror = RuleBook.Do_Mirror}
这些函数的调用方式如下所示:
ATTRIBUTES[cardPile[#cardPile].Attribute]()
我已经打印出了卡片对象和属性表的全部内容,并且两者都非常得体。具有属性的卡片在函数的属性下有一个表项,这些卡片链接到Do_uu。。。功能。然而,上面这行代码似乎不起作用。如果有人有想法或建议,我们将不胜感激。Lua允许您基本上使用任何类型的Lua值作为表中的键。上面代码的问题是,
属性
表使用字符串作为键,但cardPile[#cardPile]。属性
是函数而不是字符串
在此处执行查找时:
ATTRIBUTES[cardPile[#cardPile].Attribute]()
您的意思是在属性中查找对应的值,该属性的键为cardPile[#cardPile]。属性是一个函数。您定义的属性
表只包含作为键的字符串——它没有作为键的函数,因此返回nil
有两种可能的修复方法:
假设cardPile
的属性
字段已经引用了您想要的函数,您可以这样调用它:
cardPile[#cardPile].Attribute()
另一种方法是更改设置card_obj
的属性
字段的方式--使其引用字符串而不是函数:
function Card.Create(Suit, Number, Name)
local card_obj = {}
-- ...
if( card_obj.number == 1 ) then
card_obj.Attribute = "Reset"
elseif( card_obj.number == 6 ) then
card_obj.Attribute = "Go_Lower"
-- ... etc.
else
card_obj.Attribute = nil;
end
end
不起作用怎么办?产生了哪些错误?通常如何调用函数?从cardPile
表中给出一个示例。尝试调用字段“?”(一个nil值)是我收到的错误消息。至于我如何调用我的函数;就我所知,通常情况下。这是代码中以这种方式调用函数的唯一点。cardPile中的一个条目是:数字1,属性函数,picture 2D.png,isSelected=false。这就是我从打印出的表格中得到的,我试着用你的例子,它似乎工作得很好。请提供更多有关如何将数据存储到cardPile
表的代码。我在一个普通的循环中存储到cardPile。cardsToBePlayed是另一个表,正如您可能猜到的,它包含要玩的牌对象。此表中的对象有一系列有效性测试,以确保它们确实可播放。但不是全部代码。这只是我们可以运行的东西,但展示同样的问题将是最好的。非常感谢您的回答。我会尽快测试它(不幸的是,同时出现了一个棘手的语法错误,我需要修复)。只是想澄清一件事;当你说“cardPile[#cardPile].Attribute()”时,我假设你的意思是代替“ATTRIBUTES[cardPile[#cardPile].Attribute]()”代码行?是的,这是正确的。记住,如果答案解决了你的问题,你可以接受。