簡體   English   中英

嘗試在Lua中調用函數時出現Nil錯誤

[英]Nil error when trying to call a function in Lua

我遇到了一個奇怪的錯誤,我無法終生破解。

我正在編寫紙牌游戲,並且有兩個長度不同的桌子。 一個將條目鏈接到功能,另一個則保存已玩的卡。 第一個表用於卡組中某些卡牌具有的屬性。

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

這些函數的調用方式如下:

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

我已經打印出卡片對象和ATTRIBUTES表的內容,並且兩者都完好無損。 具有屬性的卡在功能的“屬性”下具有一個表條目,這些卡鏈接到Do _...函數。 但是上面的代碼行似乎不起作用。 如果有人有想法或建議,將不勝感激。

通過Lua,您基本上可以將任何類型的lua值用作表中的鍵。 上面代碼的問題是,您的ATTRIBUTE表使用字符串作為鍵,但是cardPile[#cardPile].Attribute是一個函數,而不是字符串。

當您在此處執行查找時:

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

您說的是在具有鍵cardPile[#cardPile].Attribute它是一個函數)的ATTRIBUTES中查找相應的值。 定義的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM