Lua For Aegisub

Lua基础语法

注释

-- this is one line comment
--[[
this is a comment

and comment again

and again
]]

变量

var_string = "foo and bar";    --用""表示string
print(var_string);

→

foo and bar

当遇到限定符号,例如",则打反斜杠(类似正则表达)

var_string = "foo and \" \\ bar";
print(var_string);

→

foo and " \ bar

大小写转换

string.upper string.lower

var_string = string.upper('foo');
print(var_string);

→

FOO

连接符

'foo'.."and"..[[bar]]

→

foo and bar

在Aegisub中用table

Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,code once,test_var = {"one", 2,3,4,5}
Comment: 0,0:00:05.00,0:00:07.00,Default,,0,0,0,template syl,!test_var[1]!
Comment: 0,0:00:07.00,0:00:09.00,Default,,0,0,0,karaoke,

↓

Dialogue: 0,0:00:07.00,0:00:09.00,Default,,0,0,0,fx,one

---

Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,code once,test_var = {foo="two", 2,3,4,5}
Comment: 0,0:00:05.00,0:00:07.00,Default,,0,0,0,template syl,!test_var.foo!
Comment: 0,0:00:07.00,0:00:09.00,Default,,0,0,0,karaoke,

↓

Dialogue: 0,0:00:07.00,0:00:09.00,Default,,0,0,0,fx,two

## print方法

> print("aa");
aa

注释

两个横杠

--print("aa");

可以按control + / 来快速切换

定义全局变量

> num = 100
> print(num)
100

定义局部(方法内部、文件内部)变量

local num = 100

定义方法/函数

function sayhello()
  print("hello lua functions")
end

sayhello()
→
hello lua functions

定义有传入传出参数的方法 条件语句

function max(a,b)
    if a>b then
        print(a)
    else
        print(b)
    end
end

max(2,7)
→
7

也可以用return方法

function max(a,b)
    if a>b then
        return(a)
    else
        return(b)
    end
end

print(max(2,1))

→

2

For循环

for var=init, end(, step) do
  **
end

E.g:

for i = 3, 1, -1 do
    print(i)
end

→

3
2
1

config = {} --创建空的表
config.words = "hello" --元素
config.num = "100"
config["name"]="zhang san" --键

print(config["words"]) --键
print(config.name) --元素

→

hello
zhang san

也可以在大括号内直接定义:

config={alpha="AA",beta="BB"}

print(config.alpha)
print(config["beta"])

→

AA
BB

遍历表

for key, var in pairs(table) do --table为表的名字
  **
end
例如:
config={alpha="AA",beta="BB"}

for key, var in pairs(config) do
    print(key,var)
end

→

alpha   AA
beta    BB

此外,用#tablename可以获取表的元素数

数组

lua没有数组的概念,通常用表来完成

arr = {1,2,3,"hellp"} --定义初始值

for key, var in pairs(arr) do --循环打印数组
    print(key,var)
end

→

1   1
2   2
3   3
4   hellp

可以理解为:左边为数组索引,右边为数组的内容
另,lua的索引是从1开始的,而非0.

Table.insert

arr = {1,2,3} --定义初始值

table.insert(arr,2,"foo")---在arr数组的第2个位置插入了“foo”

for key, var in pairs(arr) do --循环打印数组
    print(key,var)
end

→

1   1
2   foo
3   2
4   3

生成一个倒序数列:

arr = {} --定义初始值

for var=1, 5 do --每次循环都在第一个位置插入数值
    table.insert(arr,1,var)
end

for key, var in pairs(arr) do --循环打印数组
    print(key,var)
end

→

1   5
2   4
3   3
4   2
5   1

泛型For循环

泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。[1]
Lua 编程语言中泛型 for 循环语法格式:[2]

--打印数组a的所有值  
a = {"one", "two", "three"}
for i, v in ipairs(a) do
    print(i, v)
end 

>

1   one
2   two
3   three
a = {"one", "two", "three"}
for i, v in ipairs(a) do
    print("table["..i.."]="..v)
end 

>

table[1]=one
table[2]=two
table[3]=three

i是数组索引值(下标),v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。i和v均可以是自定的变量名。

用枚举型For做一个表元素统计器

枚举型For可以计算下标不连续的table元素个数,因为如果下标是字符串,就不能用#来计算table长度。

function getLength(tab)

    local n=0
    for i,v in pairs(tab) do
        n=n+1
    end
    return n
end

fruit={a="123",b="abc",c="df8"}
print(getLength(fruit))

>

3

迭代器

pairs实质上是一个迭代器。迭代器本身就是一个函数(迭代器函数),其内部还存在一个执行迭代的函数(迭代函数)。
迭代器能够遍历某些集合中的部分或者全部元素,每次调用迭代器函数时,返回集合的下一个元素。
泛型For实际上的格式为:

for 变量列表 in 迭代器 do
    语句块
end

编写一个迭代器

function iterator (tbl)
    local index = 0
    local count = #tbl
    return function()
        index = index + 1
        if index <= count
        then
            return index,tbl[index]  --  返回值为元素数量组的数/字符串对
        end
    end
end

ooo={"asdf","1231","ds3"}

for i,v in iterator(ooo) do
    print(i.."   "..v)
end

>

1   asdf
2   1231
3   ds3

Break

在循环中,用break退出当前嵌套层。

参考

  1. ^两篇文森特大佬的分享https://www.bilibili.com/video/BV1i7411M7tL https://www.bilibili.com/read/cv4792836
  2. ^https://www.runoob.com/lua/lua-for-loop.html
标题:Lua For Aegisub
作者:IKK
除转载和特殊声明外,所有文章采用 CC BY-NC-SA 4.0协议
上一篇
下一篇