Прототипирование «объекта» с другим «объектом» в Lua - PullRequest
2 голосов
/ 08 апреля 2020

Учитывая следующий код:

http. lua

local function create_socket()
    -- do stuff to create socket
    return socket, err
end


local _M
local mt = { __index = _M }


function _M:new()
    local sock, err = create_socket()
    if not sock then
        return nil, err
    end
    return setmetatable({ sock = sock, keepalive = true }, mt)
end

function _M:function1() end
function _M:function2() end

return _M

http_extender. lua

local http = require "http"


local _M = {}

function _M:new()
    local o = setmetatable(self, {__index = http.new()})
    return setmetatable({}, {__index = o})
end

function _M:function3() end
function _M:function4() end

return _M

Учитывая, что http_extender предназначен для расширения функциональности http, пара вопросов:

  1. У меня такое ощущение, что с http_extender:new() что-то не так по своей сути, потому что оно модифицирует self для каждого вызова, верно?
  2. Если действительно так, то каков будет правильный способ сделать это так, чтобы каждый вызов to http_extender:new() создает новый http «объект», который состоит из функций и атрибутов http_extender?

Спасибо

1 Ответ

1 голос
/ 08 апреля 2020

Чтобы добиться этого, я бы использовал что-то вроде этого

local http = require "http"

local _M = {}

function _M:new() 

    local newob = http.new()

    local mt = getmetatable( newob )
    setmetatable( mt.__index, { __index = self } )

    return newob

end

function _M:function3() end
function _M:function4() end

return _M

Метод _M:new() в этом коде будет создавать объекты с функциональностью как _M, так и объекта http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...