尝试在Lua中调用函数时发生了空错误。

我遇到了一个奇怪的错误,我无论如何都无法解决。

我正在编写一款卡牌游戏,我有两个不同长度的表格。其中一个将条目链接到函数,另一个保存打出的卡牌。第一个表格是用于特定卡牌的属性的。

ATTRIBUTES = {
        Reset   = RuleBook.Do_Reset,
        Go_Lower= RuleBook.Do_Go_Lower,
        Mirror  = RuleBook.Do_Mirror}

这些函数的调用方式如下:

ATTRIBUTES[cardPile[#cardPile].Attribute]()

我已经打印出了卡牌对象和ATTRIBUTES表格的内容,两者都完好无损。具有属性的卡牌在Attribute下有一个表格条目,链接到Do_...函数。然而,上面的代码行似乎不起作用。如果有任何想法或建议,将不胜感激。

点赞
用户234175
用户234175

Lua 允许您基本上将任何类型的 lua 值用作表中的键。以上面的代码为例,您的 ATTRIBUTE 表将字符串用作键,而 cardPile[#cardPile].Attribute 是一个函数 而不是 一个字符串。

在这里进行查找时:

ATTRIBUTES[cardPile[#cardPile].Attribute]()

您的意思是查找 ATTRIBUTES 中具有键 cardPile[#cardPile].Attribute(其为函数)的相应值。您定义的 ATTRIBUTES 表仅包含字符串作为键-它没有将函数作为键,因此返回 nil

对于此问题,有两种可能的修复方法:

假设 cardPileAttribute 字段已引用您想要的函数,则可以像这样调用它:

cardPile[#cardPile].Attribute()

另一种方法是改变 card_objAttribute 字段的设置方式-使其引用一个字符串而不是函数:

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
2013-03-05 20:57:38