Lua-技巧积累

表构造器函数调用写法

表构造器写法, 即 funcname{table_content}, 不用加上括号, 如:

1
2
3
4
5
6
function printPerson(person)
print("Name:", person.name)
print("Age:", person.age)
end

printPerson{ name = "John", age = 25 }

给函数参数设置默认值

可以结合 or:

1
2
3
4
function greet(name)
name = name or "Guest"
print("Hello, " .. name .. "!")
end

取 table 长度符号 # 的缺陷

在 Lua 中, 使用 # 操作符可以获取一个表 (table) 的长度. 然而, 在给表赋值时, #my_table 并不会实时更新表的长度. 它只能计算出表中连续的整数键的数量.

字符串转数字

1
2
local str = "10"
local n = tonumber(str)

统计字符串中的 \n 数量

1
2
3
4
local str = "This is a\nmulti-line\nstring\nwith line breaks."

local count = select(2, str:gsub("\n", ""))
print("Number of '\\n': " .. count)

获取所有全局变量名称

可以认为, Lua 把所有全局变量保存在一个称为全局环境 (global environment) 的普通表中.

Lua 将全局环境自身保存在全局变量 _G 中 (_G._G 与 _G 等价).

1
for n in pairs (_G) do print(n) end

获取一个目录下的全部文件

1
2
3
4
5
6
7
8
9
10
11
-- Lua implementation of PHP scandir function
function scandir(directory)
local i, t, popen = 0, {}, io.popen
local pfile = popen('ls -a "'..directory..'"')
for filename in pfile:lines() do
i = i + 1
t[i] = filename
end
pfile:close()
return t
end

io.popen 返回一个进程的文件句柄, 这个进程似乎可以可以运行 shell 命令.

文件句柄这一类对象都有 lines(), close() 这些方法.

命令行参数

Lua 把命令行参数存储在 arg 表中.

获取 vimscript 变量

如获取 vimscript 内置变量:

1
var = vim.api.nvim_get_vvar("argv")

获取列表长度

使用 #

多线程运行程序

Lua 的包管理器及其配置

有两个比较流行的包管理器:

  • luarocks
  • luapack

这里以 luarocks 为例.

Archlinux 下安装

1
$ sudo pacman -S luarocks

配置

luarocks 会读取两个主要的配置文件:

  • /etc/luarocks/config.lua
  • ~/.luarocks/config.lua

前者的优先级更高.

配置模块的安装位置, 如:

1
2
3
4
5
6
-- 设置默认安装位置
rocks_trees = {
{ name = "system", root = "/usr/local" },
{ name = "user", root = home.."/.luarocks" }
}

配置软件源, 如:

1
2
3
4
5
rocks_servers = {
"https://luarocks.cn/",
"https://mirrors.tuna.tsinghua.edu.cn/luarocks/",
"http://luarocks.org/repositories/rocks/"
}

类似 Perl 中 Data::Dumper 的模块

inspect, 可用:

1
$ luarocks install inspect

来安装.

基本使用:

1
2
3
4
5
6
7
8
9
local inspect = require("inspect")

local my_table = {
a = 1,
b = "hello",
c = {d = true, e = {f = 2}}
}

print(inspect(my_table))

lua 命令行文档查看工具 ldoc

可用 luarocks 来安装:

1
$ luarocks install ldoc

在 Archlinux 也可以用 pacman 来安装:

1
$ sudo pacman -S ldoc

基本使用:

1
$ ldoc <module-name>

任意字符的非贪婪匹配

(.-) 用于捕获任意字符 (除了换行符) 的非贪婪匹配, 如:

1
2
3
4
local str = "Some text before\n```\nCode block\n```\nSome text after"
local pattern = "```(.-)```"
local match = str:match(pattern)
print(match)

将一个多行字符串拆开

1
2
3
for line in str:gmatch("[^\r\n]+") do
...
end

对每一个 gsub 匹配到的字符串的操作

1
2
3
4
5
6
7
local titles = without_code_block:gsub("[^\r\n]+", function(line)
if line:sub(1, 1) == "#" then
return line
else
return ""
end
end)

定义 table 时, 键值中的 [] 的作用

用于在运行中求值, 如:

1
2
3
4
5
6
7
8
local cal = {
[1+1] = 2,
[2+2] = 4
}

for k, v in pairs(cal) do
print(k.." = "..v)
end

输出:

1
2
2 = 2
4 = 4

Lua 正则中的转义字符

% 对特殊字符进行转义.


Lua-技巧积累
http://example.com/2023/01/04/Lua-技巧积累/
作者
Jie
发布于
2023年1月4日
许可协议