飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • AngularJS教程
  • UEditor使用文档
  • ThinkPHP5.0教程

EmmyLua 注解功能

时间:2021-12-16  作者:SouthBegonia  
对EmmyLua注解功能的简单演示

前言

网上配置 EmmyLua 的方法很多,此处就不做赘述(因此前提是你已经安装配置完EmmyLua)

本文仅是对 EmmyLua插件 内 注解功能 用法的代码演示。因为网上大部分EmmyLua配置教程中都没对此部分进行讲解,而实际lua开发时EmmyLua的注解功能几乎必不可缺,故作此文

注解的目的

我们在编写C#脚本时,IDE的相关插件能提示各类方法或成员以及描述:

但Lua内,即便在安装完EmmyLua,不写注解的话,也就没有任何提示(灰色提示仅表示刚有写过该参数而已,完全不知道是成员变量或方法):

因此EmmyLua注解功能就是为了解决该问题:模拟实现OOP编程中代码提示

注解用法

类声明

基本格式:--@class MY_TYPE[:PARENT_TYPE] [@comment]

---@class Person 人
Person = {};

---@class Gamer : Person 玩家
Gamer = {};

变量类型

基本格式:---@type MY_TYPE[|OTHER_TYPE] [@comment]

PS:按上述官方用法,comment描述应当放在末尾,但我这试了下type不大行,可以放在顶部

---@type number 我的ID
myId = 1;

---玩家的表
---@type table<number, Gamer>
gamersTable = {};

---@type Person Person实例
personA;
---@type Gamer Gamer实例
gamerA;

变量的额外属性

即使该类未持有某属性,也可以通过添加注解,在提示内出现(PS:其实EmmyLua实现UnityAPI的提示也是基于此的)

基本格式:---@field [public|protected|private] field_name FIELD_TYPE[|OTHER_TYPE] [@comment]

---@class Person 人
---@field public Name string 名字
---@field private m_Age number 年龄
Person = {
    Name = "",
};

函数

  • 标记函数定义参数的类型:---@param param_name MY_TYPE[|other_type] [@comment]
  • 标记函数的返回值类型:---@return MY_TYPE[|OTHER_TYPE] [@comment]
---取得台词
---@param isCN boolean 是否是中文
---@param id number 台词字典ID
---@return string 台词
function GetLines(isCN, id)
    local str = "";    -- do something
    return str;
end

备注

在IDEA下,对目标使用Alt+Enter快捷键(或点小灯泡),可较方便自动补全注解:

完整事例

现有Person基类,Gamer类继承自Person,在域名内实现两个类的创建及使用(直接粘到本地跑就行):

域名:

require("Person");
require("Gamer");

---@type Person
local pa = Person:Create("joker", 18);
pa:ShowInfo();
pa:ReName("Joker");
pa:ShowInfo()

---@type Gamer
local ga = Gamer:Create("fox", 19, nil, nil);
ga:ShowInfo();
ga:ReName("Fox");
ga:ReGamerInfo("123", "456");
ga:ShowInfo();

域名:

---@class Person 人类型
---@field public Name string 名字
---@field private m_Age number 年龄
Person = {
    Name = "",
    m_Age = 0,
};

域名dex = Person;

---Create
---@param name string
---@param age number
function Person:Create(name, age)
    ---@type Person
    local t = {};

    setmetatable(t, Person);

    t:ReName(name);
    t:ReAge(age);

    return t;
end

---ReName
---@param newName string
---@public
function Person:ReName(newName)
    域名 = newName;
end

---ReAge
---@param newAge number
---@private
function Person:ReAge(newAge)
    域名e = newAge;
end

---ShowInfo
---@public
function Person:ShowInfo()
    print("Name = " .. 域名 .. ", Age = " .. 域名e);
end

域名:

require("Person")

---@class Gamer : Person 玩家
---@field private SW string SW码
---@field private SteamId string Steam链接
Gamer = {
    SW = "",
    SteamId = "",
};

域名dex = Gamer;
setmetatable(Gamer, Person);

function Gamer:Create(name, age, sw, steamId)
    ---@type Gamer
    local t = {};
    t = Person:Create(name, age);

    setmetatable(t, Gamer);

    t:ReGamerInfo(sw, steamId);

    return t;
end

---ReGamerInfo
---@param sw string
---@param steamId string
---@public
function Gamer:ReGamerInfo(sw, steamId)
    域名 = sw or "0";
    域名mId = steamId or "0";
end

---ShowInfo
---@public
function Gamer:ShowInfo()
    print("Name = " .. 域名 .. ", Age = " .. 域名e .. ", SW = " .. 域名 .. ", SteamId = " .. 域名mId);
end

PS:可以用 在Lua中实现面向对象特性——模拟类、继承、多态 - 马三小伙儿 大佬这篇的代码练手

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。