воскресенье, 29 апреля 2012 г.

LUA для самых маленьких vol 2

Пустячок. Косвенный вызов глобальной функции


Общая задача - косвенный вызов метода. Решение на примере глобальной таблицы имен _G , расширяемое, естественно до любой объектной модели, реализованной таблицами, будь то наследование прототипированием или копированием.
Суть решения - при обращениии к несуществующему ключу таблицы (в нашем случае -  вызове функции) - запускать прокси-функцию, формирующую нужный внешний вызов. В иллюстративных целях прокси-функция выводит в лог информацию о вызове и больше ничего не делает. Валидации вызова (типа isFunction) не оформлено, что приведет к побочному эффекту - при попытке доступа к несуществующей переменной будет вызвана прокси-функция.



local function externCall(method,...)
   print("call external method "..method.." with "..#{...}.." params")
   for ndx,val in ipairs({...}) do
      print("   #"..ndx.." ["..type(val).."] "..tostring(val))
   end
end
local mt = {}
mt.__index = function(t, k)
  t[k] = function(...) externCall(k,...) end
  return t[k]
end
setmetatable(_G, mt)

-- использование
     
test1(1,2,3,4,5,6
test2("раз","два","три")
test3()





Комментариев нет:

Отправить комментарий