lua 中换行不起任何作用 以下程序块等价
a = 1
b = a*2
a = 1;
b = a*2;
a = 1; b = a*2
a = 1 b = a*2
lua中应该避免以下划线开头并跟着大写字母,如(_VERSION)
lua区分大小写
lualua中全局变量不需要声明,只需将一个值赋给全局变量,未初始化的全局变量的值为nil
可以访问未初始化的全局变量,它的值为nil,将全局变量赋值为nil等同删除它
lua中有8种基础类型:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)、table(表)
函数type()以字符串的形式返回参数的类型
nil是一种类型,它只有一个值nil,它的主要功能用于区别其他任何值
boolean只将false和nil视为假,数字0和空字符串视为真
string:除了‘ ’和“ ”,可以用一对匹配的双方括号来界定字符串。如果第一个字符是一个换行字符,lua会忽略
lua提供了运行时的数字与字符串的自动转换。在一个字符串上应用算数操作,lua会尝试将其转化为一个数字:
print("10" + 1) --> 11
print("10 + 1") --> 10+1
print("-5.3e-10" * "2" --> -1.06e-09
print("hello" + 1) -->错误(不能转化hello)
相反,在lua期望一个字符串但却得到一个数字时,它会将数字转化成字符串:
print (10 .. 20) --> 1020
-->..是字符串连接操作,数字后面需要接空格在接..
-->不建议以上写法,可以用tonumber和tostring转化
lua中在字符串前放置操作符“#”来获得字符串长度
table是lua中仅有的数据结构,没有固定的大小,可以用不同类型的索引来访问,lua也是通过table表示模块、包和对象
一个持有table的变量与table自身没有固定的关联性,当一个程序再也没有对一个table的引用,lua的垃圾收集器会释放该table的内存
a.x和a[x]的区别,前者表示a[“x”],表示以字符串“x”来索引table。而后者是以变量x的值来索引table
a = {x = 10, y = 20} 等价于 a[“x”] = 10,a.x = 10
table表示数组:只需要以整数作为key来使用table,无需声明大小值,通常以1做为索引的起始值
“#数组名”用于返回一个数组或线性表的最后一个索引值,若数组有空隙,即中间含有nil,长度操作符会认为nil是结尾标志,table.maxn()会返回一个table的最大正数索引
lua中%(取模)操作,x%1表示取x的小数部分,x-x%1的结果就是其整数部分。
x = math.pi
print(x-x%0.01) -->3.14
lua关系操作符:不同类型的值是不等的,nil只与自身相等,字符串比较按照字母次序,
2<15 -->true;
"2" < "15" -->false;
对于table和userdata,lua作引用比较,只有当他们引用同一个对象时,才认为相等
逻辑操作符and、or、not,只将false和nil视为假,数字0和空字符串视为真
and 和 or 采用短路求值:and第一个操作数为假,返回第一个操作数,否则返回第二个操作数,注意不是返回真,or也同理。not只返回true或false
一种lua习惯写法 “x=x or v”,它的意思是x的求值结果为假时,将其设为一个默认值v
在多重赋值中,lua先对等号右边的所有元素求值,然后才执行赋值 x,y = y,x可用来交互两个变量
在多重赋值中,若右值个数少于左值,左值会被赋予nil,若右值个数多余左值,多余的值会被丢弃
在多重赋值中,若一个函数调用是最后的一个表达式(或仅有的),那么lua会保留尽可能多的返回值,不足的会用nil补充,若不是一系列表达式最后的元素,只产生一个值
当一个函数调用作为另一个函数调用的最后一个实参时(或仅有的),第一个函数的所有返回值都将作为实参传入第二个函数,否则只产生一个值
将函数调用放入一对圆括号中,会迫使它只会返回一个结果
unpack:它接受一个数组作为参数,并从下标1开始返回该数组的所有元素
局部变量技巧:
local foo = foo
这句代码创建了一个局部变量foo,用全局变量foo的值来初始化它,这可以加速在当前工作域中对foo的访问
在lua中,一个声明在循环体中的局部变量的作用域包括了条件测试
数字型for循环:var从exp1变化到exp2,每次以exp3作为步长,exp3是可选的,不指定的话默认为1,控制变量会被自动声明为局部变量,循环外部使用会出错
lua中的循环
for var = exp1,exp2,exp3 do
<执行体>
end
泛型for循环:
ipairs:用于遍历数组的迭代器函数
pairs:用于遍历table的迭代器
for i,v in ipairs(a) do print (v) end
每次循环i会被赋予一个索引值,同时v被赋予一个该索引代表的元素值
编译:
loadfile会从一个文件加载lua代码块,但它不会运行代码,只是编译代码,将编译结果作为一个函数返回
loadfile不会引发错误,只是返回错误值并不处理错误,可以这样定义dofile
function dofile (filename)
local f = assert(loadfile(filename))
return f()
end
如过需要多次运行一个文件,那么只需调用一次loadfile后,多次调用它的返回结果就好了
错误处理:
assert函数检查其第一个参数是否为true。若为true,则简单地返回该参数;否则引发一个错误,第二个参数是一个可选的信息字符串
file = assert(io.open(“no-file”, “r”))
执行lua程序块时发生了错误,再次调用会返回一个错误代码,如果需要在Lua中处理错误,则需使用pcall来包装需要执行的代码
pcall函数会以一种“保护模式”来调用它的第一个参数,因此pcall可以捕获函数执行中的任何错误,返回true和函数调用的返回值,或者false及错误消息
如果错误消息是一个字符串,Lua会附加一些关于错误发生位置的信息
local status,err = pcall(function() a = “a”+a end)
print(err) –>stdin:1:attempt to perform arithmetic on a string value (包含了文件名及行号)
在lua中,可以借由table构造式来定义一种文本格式,将table构造的数据作为lua代码来输出,当运行(dofile)这些
代码时,程序也就读取了数据。
串行化字符串可以以“%q”来使用string.format函数,这样它会用双引号来括住字符串,并且正确转移其中的特殊符号
a = ‘a “problematic” \string’
print(string.format(“%q”, a)) –>”a \”problematic\” \string”
本文深入讲解Lua语言的基础概念,包括语法特性、数据类型、变量管理、字符串与表操作、流程控制等内容。通过丰富的示例说明Lua如何进行数字与字符串转换、表的使用技巧以及错误处理机制。
353

被折叠的 条评论
为什么被折叠?



