У меня есть пустая таблица, которую я хочу использовать как «шлюз» для другого набора функций в другом месте.
tbl = {}
Я хочу передать вызываемые функции из этой таблицы в другое место в виде строки:
tbl.someMethod("hello")
Я пробовал это с ограниченным успехом.
hand = {
__index = function(tbl, name)
hand[name] = function(...)
passToSomewhere(name, ...)
end
end,
__call = function(tbl, name, ...)
hand[name](...)
end
}
setmetatable(tbl, hand)
tbl.someFunction("hello!", someTbl, someNumber)
Как перенаправить неопределенную функцию через таблицу без ошибок?
Изменить: Подробнее
Я пытаюсь определить и вызвать функцию в таблице одним вызовом:
tbl = {}
hand = {
__index = function(tbl, name)
print(name)
tbl[name] = function(...)
print(...)
end
end
}
setmetatable(tbl, hand)
s,e = pcall(tbl.help,"banana","goat")
print(s)
s,e = pcall(tbl.help,"banana","goat")
print(s)
Этот код работает, но первый вызов вызовет ошибку, поскольку функция еще не определена.
Скажем, я хотел использовать библиотеку, которая, как я знаю, довольно часто обновляется и поддерживает совместимость моего сценария, и эта библиотека может отсутствовать на моем компьютере. Я хотел бы перенаправлять вызовы этой библиотеки через какой-либо интерфейс, но я все еще хочу иметь возможность вызывать функции таким же образом.
--For example I would like to call this function like this:
someLib.doSomething(name, age, telephone)
--Instead of passing it through another function:
someOtherLib.invoke("someLib.doSomething", name, age, telephone)
Это возможно?
Редактировать 2:
Спасибо @greatwolf!
Это мой рабочий тестовый код.
tbl = {}
hand = {
__index = function(tbl, name)
tbl[name] = function(...)
return print(name, ...)
end
return rawget(tbl, name)
end
}
setmetatable(tbl, hand)
tbl.help("banana","goat")
return hand[name]
? Не уверен, что это то, что вам нужно, но если ваш__index
ничего не возвращает, вы в конечном итоге попытаетесь вызватьnil
, и это вызовет ошибку. - person greatwolf   schedule 19.01.2015setmetatable(tbl,{__index=othertbl})
не работает? - person lhf   schedule 19.01.2015