前言
網上配置 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
,在Main.lua內實現兩個類的建立及使用(直接粘到本地跑就行):
Main.lua:
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();
Person.lua:
---@class Person 人型別
---@field public Name string 名字
---@field private m_Age number 年齡
Person = {
Name = "",
m_Age = 0,
};
Person.__index = 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)
self.Name = newName;
end
---ReAge
---@param newAge number
---@private
function Person:ReAge(newAge)
self.m_Age = newAge;
end
---ShowInfo
---@public
function Person:ShowInfo()
print("Name = " .. self.Name .. ", Age = " .. self.m_Age);
end
Gamer.lua:
require("Person")
---@class Gamer : Person 玩家
---@field private SW string SW碼
---@field private SteamId string Steam連結
Gamer = {
SW = "",
SteamId = "",
};
Gamer.__index = 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)
self.SW = sw or "0";
self.SteamId = steamId or "0";
end
---ShowInfo
---@public
function Gamer:ShowInfo()
print("Name = " .. self.Name .. ", Age = " .. self.m_Age .. ", SW = " .. self.SW .. ", SteamId = " .. self.SteamId);
end
PS:可以用 在Lua中實現物件導向特性——模擬類、繼承、多型 - 馬三小夥兒 大佬這篇的程式碼練手