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]()”代码行?是的,这是正确的。记住,如果答案解决了你的问题,你可以接受。