Стандартный 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
2 ответа
Я нашел решение.
self[self.func](self) --self.func needs to be a string for it to work
self.func = test.saySomething
и сделать self:func()
позже, чтобы вызвать метод saySomething
на self
, без необходимости хранить ключи к функциям.
Определение функции в таблице с :
в качестве разделителя устанавливает первый заданный параметр при вызове как локальную переменную 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.
Чтобы пойти дальше, вам следует взглянуть на метатаблицы.
Если вам нужны закрытые члены, вы можете скрыть эти переменные в функции построения объекта, см. закрытия.
Похожие вопросы
Новые вопросы
function
Функция (также называемая процедурой, методом, подпрограммой, подпрограммой или макросом) — это часть кода, предназначенная для выполнения одной конкретной задачи. Используйте этот тег для вопросов, которые конкретно связаны с созданием или вызовом функций. Чтобы получить помощь в реализации функции для выполнения задачи, используйте вместо нее [алгоритм] или тег для конкретной задачи. Создавая функцию, логику можно изолировать и вызывать многократно.
self:func()