Skip to main content

游戏开发:Lua的Class补全

Feishiko
Author
Feishiko
Programming Avali

最近写Lua的时候偶然发现可以通过文档注释然后为拟定成Class的Table进行补全。

比如说GameObject:Find(string)这个函数,要填一个string,正常情况下是不会返回table的,如果使用了lua-ls的annotation就可以使得language server补全所要返回的东西。

---Make a GameObject
---@generic T
---@param class `T`
---@return T
function M:New(class)
    ---@class GameObject
    local obj = { x = 0, y = 0, zIndex = 0, width = 0, height = 0, class = class, keep = false, id = M.currentID };

使用以上代码在创建Class的时候annotation里使用泛型,参数标记泛型并且使用`(backticks),具体可以参考这篇:

https://luals.github.io/wiki/annotations/#generic

在我自己写的代码中会使得class添加到一个table里:

table.insert(M.instanceList, obj);

创建实例后,在Find函数调用便能返回补全

---Find an instance by name
---@generic T
---@param name `T` # the type is captured using `T`
---@return T
function M:Find(name)
    for key, value in pairs(M.instanceList) do
        if (value.class == name) then
            return value
        end
    end
    return nil
end

之后只需在创建class前加上---@class的注释标记就行了

function M:New()
    ---@class Circle: GameObject
    local o = utility.gameObject:New("Circle")

像这样,以下代码便能用过lua-ls补全

local player = utility.gameObject:Find("Player");

comments powered by Disqus