Стандартный lua позволяет мне вызывать функции с переменными. например см. код ниже:

function person(func) --func value: saySomething
    local thefunc = func
    thefunc() --var used to call function works
end

function saySomething()
    print("hello")
end

Итак, мой вопрос: можем ли мы сделать то же самое объектно-ориентированным способом? например.:

--psuedo code to give you a general idea
class test
function test:init(func) --func value: saySomething
    self.func = func
end

function test:person()
    self:self.func() --this doesnt work
end

function test:saySomething()
    print("hello")
end
1
Richard Avalos 3 Сен 2015 в 01:49
Ты можешь просто сделать self:func()
 – 
moteus
3 Сен 2015 в 09:43

2 ответа

Лучший ответ

Я нашел решение.

self[self.func](self) --self.func needs to be a string for it to work
-1
Richard Avalos 3 Сен 2015 в 02:03
3
Вы можете использовать self.func = test.saySomething и сделать self:func() позже, чтобы вызвать метод saySomething на self, без необходимости хранить ключи к функциям.
 – 
ryanpattison
3 Сен 2015 в 02:17

Определение функции в таблице с : в качестве разделителя устанавливает первый заданный параметр при вызове как локальную переменную self для тела функции.

Вызов функции в таблице с : в качестве разделителя добавляет ссылку на таблицу в качестве первого аргумента в список параметров.

local myclass = {}

function myclass:saySomething()
    print(self)
end
myclass.saySomething("Jiiiiiii~")   -- Jiiiiiii~

function myclass.saySomething(self)
    print(self)
end
myclass:saySomething()  -- table: 0x000a6ea0

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

Чтобы пойти дальше, вам следует взглянуть на метатаблицы.

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

1
Youka 3 Сен 2015 в 15:53