表构造器函数调用写法 表构造器写法, 即 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 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 tend
io.popen
返回一个进程的文件句柄, 这个进程似乎可以可以运行 shell 命令.
文件句柄这一类对象都有 lines()
, close()
这些方法.
命令行参数 Lua 把命令行参数存储在 arg
表中.
获取 vimscript 变量 如获取 vimscript 内置变量:
1 var = vim.api.nvim_get_vvar("argv" )
获取列表长度 使用 #
多线程运行程序 Lua 的包管理器及其配置 有两个比较流行的包管理器:
这里以 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
来安装:
在 Archlinux 也可以用 pacman
来安装:
基本使用:
任意字符的非贪婪匹配 (.-)
用于捕获任意字符 (除了换行符) 的非贪婪匹配, 如:
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
输出:
Lua 正则中的转义字符 用 %
对特殊字符进行转义.