2010-03-14 42 views
3

使用Lua,我試圖動態地調用帶參數的函數。 我想發出一個字符串的方式,解析:Lua:動態調用帶參數的函數

  • 第一個參數是一個類的實例「處理」
  • 第二點是被稱爲
  • 所有剩下的參數的函數

「模塊」是像{ string=<instance of a class> }
分裂()是一個簡單的解析器返回表與索引字符串AA表。

function Dynamic(msg) 
    local args = split(msg, " ") 
    module = args[1] 
    table.remove(args, 1) 
    if module then 
     module = modules[module] 
     command = args[1] 
     table.remove(args, 1) 
     if command then 
      if not args then 
       module[command]() 
      else 
       module[command](unpack(args)) -- Reference 1 
      end 
     else 
      -- Function doesnt exist 
     end 
    else 
     -- Module doesnt exist 
    end 
end 

當我嘗試這與「忽略刪除鮑勃」,由「參考文獻1」,它試圖呼籲與模塊「忽略」相關的實例「刪除」,並給出了說法「鮑勃」,包含在一個表中(具有單個值)。

但是,在調用的另一端,remove函數不接收參數。我甚至試圖用

module[command]("bob") 

替代「但是我得到了同樣的結果。

這裏是其它功能,不接受的說法"bob"

function TIF_Ignore:remove(name) 
    print(name) -- Reference 2 
    TIF_Ignore:rawremove(name) 
    TIF_Ignore:rawremovetmp(name) 
    print(title.. name.. " is not being ignored.") 
end 

我的代碼中增加了「參考文獻2」時,我試圖找出什麼是錯的。當我做「忽略刪除bob」,或者當我用「參考1」中的「bob」替換「unpack(args)」時,「remove」中的變量「name」仍然是零。

+0

你的代碼看起來不錯。 「另一方」是什麼樣的。 – 2010-03-14 06:43:53

+0

功能'split'看起來像什麼,因爲它不是標準Lua的一部分。 – 2010-03-14 07:01:32

回答

3

聲明function TIF_Ignore:remove(name)相當於function TIF_Ignore.remove(self, name)。注意在第一種情況下使用冒號,它增加了額外的隱藏參數來模擬OOP和類。您調用該函數的方式是,您通過「bob」作爲self參數而不是name

要解決此問題,您可以使remove「靜態函數」如下所示:function TIF_Ignore.remove(name)。但是,您還必須以類似的方式更改rawremoverawremovetmp,無論是聲明還是調用網站。其他(更簡單)選項不是從args表中刪除module,它應該是第一個傳遞的參數。

+0

謝謝!我選擇了這樣一個「最好的」,因爲你指出了這個問題。我在Lua沒有經驗,我只是想「讓這件事情起作用」,而且你做到了!謝謝! – Tipx 2010-03-15 03:50:45

3

如果你想調用一個用冒號:定義的函數,你必須給它傳一個額外的參數,也就是它所期望的表。因爲你給的具體實例中不使用self,你可以切換到該點.語法,但如果你需要完整的通用性,看下面的代碼:

function Dynamic(msg) 
    local args = split(msg, " ") 
    local module = table.remove(args, 1) 
    if module and modules[module] then 
     module = modules[module] 
     local command = table.remove(args, 1) 
     if command then 
      local command = module[command] 
      command(module, unpack(args)) 
     else 
      -- Function doesnt exist 
     end 
    else 
     -- Module doesnt exist 
    end 
end 

我也有固定的一些小問題:

  • 變量應該是local
  • args總是非零。
  • 查找modules[module]可能會失敗。
  • table.remove返回刪除的元素,可以在空表上調用它。
+0

謝謝,你是anwser幫助我指出了一些其他問題,我沒有意識到,並需要修復! – Tipx 2010-03-15 03:52:02