2010-03-14 3 views
3

Используя Lua, я пытаюсь динамически вызывать функцию с параметрами. Я хочу отправить строку, которая будет анализироваться таким образом, что:Lua: Динамическое вызов функции с аргументами

  • первый аргумент является экземпляром класса «Handle»
  • второй это функция будет называться
  • Все, что осталось аргументы

«модули» аа таблицу, как { string=<instance of a class> }
раскола() является простой парсер, который возвращает таблицу с индексированных строк.

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 не принимает аргумент. Я даже попытался заменить линию «Reference 1» на

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» в моем коде, когда я пытался выяснить, что случилось. Когда я «игнорирую remove bob», или когда я заменяю «unpack (args)» на «bob» на «Reference 1», переменная «name» в «remove» по-прежнему равна нулю.

+0

Ваш код выглядит хорошо. Как выглядит «другая сторона». –

+0

И как выглядит функция «split», потому что она не является частью стандартного Lua. –

ответ

3

Декларация function TIF_Ignore:remove(name) эквивалентна function TIF_Ignore.remove(self, name). Обратите внимание на использование двоеточия в первом случае, он добавляет дополнительный скрытый параметр для эмуляции ООП и классов. Как вы называете функцию, вы передаете «bob» в качестве параметра self вместо name.

Чтобы исправить это, вы можете сделать remove «статические функции» следующим образом: function TIF_Ignore.remove(name). Тем не менее, вам также придется изменить rawremove и rawremovetmp аналогичным образом, как для объявления, так и для вызывающего сайта. Другой (более простой) вариант - не удалять module из таблицы args, это должен быть первый переданный параметр.

+0

Спасибо! Я выбрал этот anwser как «лучший», потому что вы точно определили проблему. Я не имею опыта в Lua, и я просто хочу «заставить эту работу работать», и вы сделали это! Благодаря! – Tipx

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

Смежные вопросы