chapter 1:Intro

交互模式中可以用dofile(“xxx.lua”)在中途加载函数

comment

1
2
3
4
5
-- short comment

--[[A multi-line
long comment
]]

优秀的函数注释

1
2
3
4
5
6
7
8
9
10
--[[
CMinimap:UpdateSceneName =
{
Desc = "更新场景名称",
Args =
{
{bSceneAllowPK = "该场景是否允许PK"}
}
}
--]]

Basic type nil, Boolean, number, string, userdata, function, thread, and table

chapter 3:Numbers

5.3版本lua加入整数表示

lua不区分浮点数和整数的数值,普通除法/,整数除法//。但可以用math.type(x)区别数字的类型。

用0x来表示十六进制,在16进制中,p代表2,可以在数字后缀加p2,p3,p-1来表示乘上2的几次方

1
0x1p-1==0.5

不等于~=


数学库使用:

huge最大数字,deg``rad角度制幅度制转换

math.randommath.randomseed(os.time())

Rounding functions:floor(向-inf取整), ceil(向inf取整), and modf(向0取整) (大整数情况下floor会失效)

转成浮点数x+0.0,转成整数需要调用Rounding fuctions

Chapter 4. Strings


实用技巧如何把循环变量拼入类属性,self["m_slot"..tostring(i)]


String在lua中是不可变的量,所以不支持在String上面修改单个字符。

String,Table,Fuction会自动管理内存,不需要手动释放

#+String自动返回该String的长度

tonumbertostring


String库使用:

string初始需要默认为1,可以使用-1标识最后一个字符
utf8有个自己的库

1
2
3
4
5
6
7
8
9
string.len(s)
string.rep(s, n)
string.reverse
string.lower(s)
string.upper(s)

string.sub(s, i, j)-- (The first character of a
string.char==utf8.char --给一个数字,返回对应的编码字符
string.byte(s, i)==utf8.codepoint--returns the internal numeric representation of the i-th character of the string s
1
2
3
> string.format("x = %d  y = %d", 10, 20)   --> x = 10  y = 20
> string.find("hello world", "wor") --> 7 9
> string.gsub("hello world", "l", ".") --> he..o wor.d 3

Chapter 5. Tables

Table的名字是其背后表的一个引用,There is no fixed relationship between a variable that holds a table and the table itself。 Lua中对于=符号,拷贝对象是Table的时候表示浅拷贝,拷贝对象的类型是stringnumberboolean 这些基本类型的时候会使用深拷贝。

可以通过给某个key的table值赋值nil从而删掉这个mapping

key中认为2和2.0是一个东西

record-stylelist-style initializations

1
2
3
4
5
6
7
8
polyline = {color="blue",
thickness=2,
npoints=4,
{x=0, y=0}, -- polyline[1]
{x=-10, y=0}, -- polyline[2]
{x=-10, y=1}, -- polyline[3]
{x=0, y=1} -- polyline[4]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
a={}
for i=1,10 do
a[i]=i
end
for i=1,#a do
print(a[i])
end

-- 使用pairs遍历每次遍历的顺序不一定,可以使用ipairs保持一定顺序
t = {10, print, x = 12, k = "hi"}
for k, v in pairs(t) do
print(k, v)
end

安全查询zip = company?.director?.address?.zipcode

#在Table中统计数量,通常是放回数组中从1开始到n都是有数值的个数,不代表Table中有多少个键值对。目前除了遍历之外,没见到太好的有统计Table内参数个数的情况

Table库的使用

1
2
3
table.insert(t,1,15)
table.remove--指定数字删除/直接删除最后一个元素
table.move(a, f, e, t)

table.move操作详细解析

a or b——如果a 为true,则返回a,否则返回b (当n等于nil或者false的时候n被初始化a.)

a and b——如果a 为false,则返回a,否则返回b

Chapter 6. Functions

函数可以返回多个结果,但是如果该结果要赋值给单个变量/参与表达式运算的时候,通常只保留第一个数字进行运算。

函数可以有任意个输入用...代替即可

1
2
3
4
5
6
7
8
9
function add (...)
local s = 0
for _, v in ipairs{...} do
s = s + v
end
return s
end

print(add(3, 4, 10, 25, 12)) --> 54

table.pack:把所有输入的参数打包成一个新的Table,这样就可以保证输入的参数形成一个可以遍历的数据结构。pack后的返回值,有一个多余的参数n表示Table的大小。

select函数,选择从序号x开始之后的所有参数,# 返回参数个数

1
2
print(select(2, "a", "b", "c"))       --> b    c
print(select("#", "a", "b", "c")) --> 3

table.unpack: It takes a list and returns as results all elements from the list

Chapter 7. 库函数

IO库

io.read()io.write()

read()填入参数 效果
“a” reads the whole file
“l” reads the next line (dropping the newline)
“L” reads the next line (keeping the newline)
“n” reads a number
num reads num characters as a string

io.open

OS库

The function os.execute runs a system command;

Chapter 8. Filling some Gaps

Local Variables and Blocks

局部变量的有效局限在block内,可以使用doend有效的指定block内。

1
2
3
4
5
6
7
8
local x1, x2
do
local a2 = 2*a
local d = (b^2 - 4*a*c)^(1/2)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
end -- scope of 'a2' and 'd' ends here
print(x1, x2) -- 'x1' and 'x2' still in scope

循环/选择结构

In particular, Lua treats both zero and the empty string as true.

elseif

通过例子看下基本控制结构

1
2
3
4
5
local i = 1
while a[i] do
print(a[i])
i = i + 1
end

repeat–until等价于c语言的do-while结构

1
2
3
4
5
6
-- print the first non-empty input line
local line
repeat
line = io.read()
until line ~= ""
print(line)

for循环

1
2
3
4
-- 从[exp1,exp2],以exp3的步长来遍历
for var = exp1, exp2, exp3 do
something
end

Chapter 17. Modules and Packages

Modules类似于一个封装库,可以用lua自己写Modules,然后用require函数导入该Module

Chapter 21. Object-Oriented Programming

面向对象标准写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--定义
Account = {balance = 0}
function Account.withdraw (self, v)
self.balance = self.balance - v
end

a1=Account
a1.withdraw(a1,100)

--可以借用写好的函数定义到新类上
a2 = {balance=0, withdraw = Account.withdraw}

--省去self,可以使用冒号定义函数
function Account:withdraw (v)
self.balance = self.balance - v
end
--其他定义方法
Account = { balance=0,
withdraw = function (self, v)
self.balance = self.balance - v
end
}