2015-04-08 1 views
3

Итак, я пытаюсь написать функцию, которая принимает функции как свои параметры и устанавливает их как «объекты» в Lua , Есть ли определенный синтаксис для этого, о котором я не знаю?Передача функции в качестве переменной и назначение ее объекту, все еще способному ссылаться на «self» в Lua

local function createObjectWithMethods(method1, method2) 
    local object = {} 
    object.meth1 = method1 
    object:meth2 = method2 --this throws an error expecting parameters 
    return object 
end 

Есть ли другой способ этого? Я знаю, что я мог бы жестко кодировать метод для объекта, но этот код должен иметь функции, переданные как параметры, и некоторые из этих функций должны иметь возможность ссылаться на себя. Есть идеи?

ответ

2

Вам необходимо написать переданные методы без сахара-синтаксиса self.

То есть вы не можете использовать:

function obj:meth1(arg1, arg2) 
    -- code that uses self 
end 

(если эти функции не определены на какой-либо другой объект, и будучи кросс-прикладывается к новому объекту).

Вместо этого вам нужно написать то, что указано выше, для сахара.

function meth1(self, arg1, arg2) 
    -- code that uses self 
end 
function meth2(self, arg1, arg2) 
    -- code that uses self 
end 

Тогда вы можете просто вызвать функцию нормально и назначить функции нормально.

local function createObjectWithMethods(method1, method2) 
    local object = {} 
    object.meth1 = method1 
    object.meth2 = method2 
    return object 
end 

createObjectWithMethods(meth1, meth2) 
+0

Ну, это работает. Большое спасибо за быстрый ответ. – user2704305

+1

Ключ здесь в том, что синтаксис создания функции ':' является просто синтаксическим сахаром для версии, которая включает 'self' в списке аргументов и что' obj: meth (...) 'вызывающий синтаксис является просто сахаром для' obj .meth (obj, ...) '(за исключением того, что' obj' оценивается только один раз). –

+0

Фактически просто ссылаться на метод данного объекта и сделать его методом в другом объекте. Итак, для примера 'function obj: meth1' в начале этого ответа просто передайте' obj.meth1'. Независимо от того, какой синтаксис используется, вы должны знать, является ли функция методом или нет, когда вы вызываете ее. –