Lua EmmyLua 注解详解
Why
为了使 IDE 编码体验和强语言相近
让 IDE 提前发现编码错误
BUG 查找更方便
代码阅读更方便
建议
明确字段类型
明确字段访问修饰符
明确方法参数类型
善用 ":" 继承 "|" 或 ","多个
支持格式
--类 ---@class MY_TYPE[:PARENT_TYPE] [@comment]
--类型 ---@type MY_TYPE[|OTHER_TYPE] [@comment]
--别名 ---@alias NEW_NAME TYPE
--参数 ---@param param_name MY_TYPE[|other_type] [@comment]
--返回值 ---@return MY_TYPE[|OTHER_TYPE] [@comment]
--字段 ---@field [public|protected|private] field_name FIELD_TYPE[|OTHER_TYPE] [@comment]
--泛型 ---@generic T1 [: PARENT_TYPE] [, T2 [: PARENT_TYPE]]
--不定参数 ---@vararg TYPE
--内嵌语言 ---@language LANGUAGE_ID
--数组 ---@type MY_TYPE[]
--字典 ---@type table<KEY_TYPE, VALUE_TYPE>
--函数 ---@type fun(param:MY_TYPE):RETURN_TYPE
官网完整例子
---@class Transport @parent class
---@field public name string
local transport = {}
function transport:move() end
---@class Car : Transport @Car extends Transport
local car = {}
function car:move() end
---@class Ship : Transport @Ship extends Transport
local ship = {}
---@param type number @parameter type
---@return Car|Ship @may return Car or Ship
local function create(type)
-- ignored
end
local obj = create(1)
---now you can see completion for obj
---@type Car
local obj2
---now you can see completion for obj2
local list = { obj, obj2 }
---@param v Transport
for _, v in ipairs(list) do
---not you can see completion for v
end
自己验证例子
---@class TestBase @基类
---@field protected key number @基类字段
---@class Test : TestBase @测试类
---@field bool boolean @boolean 类型字段
---@field numberArray number[] @数组
---@field numberDictionary table<number,number> @字典
---@type Test
local Test = {}
---@type number @number 类型字段(后期扩展字段 IDE 不能识别注释)
Test.num = 0
---方法 1
function Test:Func1()
--字段测试
self.key = 0 --能跳转基类
self.bool = false
self.num = 1 --IDE 不能识别注释
for i, v in ipairs(self.numberArray) do end
for k, v in pairs(self.numberDictionary) do end --遍历能识别 k v 类型
--方法测试
self:Func2("张三")
local tempFunc3 = self:Func3("李四")
local tempFunc4A, tempFunc4B = self:Func4("王五", false)
local tempFunc5 = self:Func5(false)
1
2
3
4
5
end
---方法 2 有参数
---@param name string @名字
function Test:Func2(name)
end
---方法 3 有返回值
---@return string @返回类型
function Test:Func3(name)
return name
end
---方法 4 多参数 多返回值
---@param name string @名字
---@param sex boolean @性别
---@return string , number @返回类型
function Test:Func4(name, sex)
return name, sex
end
---方法 5 参数多类型 返回值多类型
---@param sex string | boolean @性别
---@return string | boolean @返回类型
function Test:Func5(sex)
return sex
end
---方法 6 参数为方法
---@param func fun(key:number):string @函数
function Test:Func6(func)
return func(1)
end
--使用 see 注解来标注一个引用
---@see Test#Func1
--下面的不常用
--不定参数注解
---@vararg string
---@return string
local function format(...)
local tbl = { ... } -- inferred as string[]
end
--泛型
--几乎不用 C#用是因为用 object 作为参数 有装箱拆箱消耗 lua 语言天然不需要
---@class Goods @物品基类
---@field public price number @价格
---@class Food : Goods @食物
---@field public cal number @卡路里
---@class Phone : Goods @手机
---@field public battery number @电量
---@generic T : Goods
---@param object T
function Test:GetPrice(object)
return object.price
end
--内嵌语言
---@language JSON
local jsonText = [[{
"name":"Emmy"
}]]
return Test