脚本式编程
我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为 hello.lua 的脚本文件中:
print("Hello World!")
使用编译器运行这个lua文件,就可以输出结果为:
Hello World!
除了脚本式编程之外,还交互式编程,这里我觉得脚本式还是来的实在,也更加符合之前的编程习惯,所以后面的学习都将用此方法。
词法约定
变量是以字母(letter)或者下划线开头的字母、下划线、数字序列。请不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。
注意:Lua是大小写敏感的。 如and是保留字,但是And和AND则不是Lua的保留字。在SciTE中输入保留字的时候,会自动变为蓝色粗黑体。
代码规范
Lua的多条语句之间并不要求任何分隔符,如C语言的分号(;),其中换行符也同样不能起到语句分隔的作用。因此下面的写法均是合法的。如:
a = 1
b = a * 2
a = 1;
b = a * 2;
a = 1; b = a * 2;
a = 1 b = a * 2
注释
单行注释
两个减号是单行注释:
--
多行注释
--[[
多行注释
多行注释
--]]
也有看到有经验的大神补充多行注释的方法:
多行注释推荐使用 --[=[注释内容]=],这样可以避免遇到table[table[idx]]时就将多行注释结束了。
标示符
Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。
最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。
Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 Runoob 与 runoob 是两个不同的标示符。
关键词
以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标示符:
and | break | do | else |
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while |
一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。
变量
Lua变量分为全局变量和局部变量。
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,全局变量在整个文件中起作用。访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil.
print(b) --> nil
b = 10
print(b) -->10
--如果你想删除一个全局变量,只需要将变量赋值为nil
b = nil
print(b) --> nil
这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。
局部变量通过local 来声明。与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。运行以下代码结果如下:
local m = 9
if m <= 10 then
local m = 5 -- 这个局部变量m的作用范围是 then 和end 之间
print(m) -->5
end
if m <= 10 then
local a=123
print(a) -->123 局部变量
print(m) -->9 这个m是一开始声明的局部变量m
end
print(a) -->nil 因为a只存在于上面一个if end 代码块中
另外Lua是动态类型语言,声明变量的时候不要类型定义。变量的类型和当前所赋值的类型是一致的。
数据类型
Lua中的值有8种类型:nil、boolean、number、string、userdata、function、thread和table。
nil型
Lua中特殊的类型,他只有一个值:nil,它的主要功能是由于区别其他任何值。一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。Lua将nil用于表示一种“无效值”的情况。
boolean型
该类型有两个可选值:false和true。但要注意Lua中所有的值都可以作为条件。在Lua中只有当值是false和nil时才视为“假”,其它值均视为真,如数字零和空字符串,这一点和C语言是不同的。
number型
表示实数。双精度类型的实浮点数。
string型
指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。
m = "abc"
n = "\97\98\99" -- “a”的数值是97(decimal),”b”是98,”c”是99
print(m,n) --> abc abc
print(“\09798”) --> a98
string和其他对象一样,Lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本 书,Lua可以高效的处理长字符串,1M的string在Lua中是很常见的。可以使用单引号或者双引号把一串字符括起来表示字符串:
a = "hello"
b = 'world'
为了风格统一,最好使用一种。例如一直使用双引号来表示字符串。如果双引号之间有单引号,系统会自动识别此单引号;如果双引号中之间还有双引号,则里面的双引号需要用转义字符\来区别: \
print("one line\nnext line\n\"in quotes\", 'in quotes'")
--[[
运行结果是:
one line
next line
"in quotes", 'in quotes'
]]
另外记住: Lua中的字符串是恒定不变的。String.sub函数以及Lua中其他的字符串操作函数都不会改变字符串的值,而是返回一个新的字符串。一个常见的错误是:string.sub(s, 2, -2)
认为上面的这个函数会改变字符串s的值。其实不会。如果你想修改一个字符串变量的值,你必须将变量赋给一个新的字符串:s = string.sub(s, 2, -2)
table型
table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:数组、矩阵、链表、队列等,Lua都是通过table来很好地实现。
Lua中table的键(key)可以为任意类型(nil除外)。当通过整数下标访问table中元素时,即是数组。此外,table没有固定的大小,可以动态的添加任意数量的元素到一个table中
local t = {32,"jeep", name = "cherry"}
local p = {["name"] = "peach"}
print(t[1]) --> 32
print(t[2]) --> jeep
print(t["name"],t.name) --> cherry cherry
print(p["name"],p.name) --> peach peach
function型
函数是第一类值,意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。这个特性给了语言很大的灵活性
userdata型
userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操userdata用来描述应用程序或者使用C实现的库创建的新类型。
我们也可以通过type函数获得变量的或值的类型信息,该类型信息将以字符串的形式返回。
local k = 1 -- k是局部变量
print(type(k)) --> number
k = "today is Friday" -- 将一个字符串赋值给k
print(type(k)) --> string
k = {1,2} -- 将一个表赋值给k
print(type(k)) --> table
local d -- d 是局部变量,声明的时候未赋值
print(type(d)) --> nil
d = 11 -- d 后来被赋值
print(type(d)) --> number
h = 9 -- h是全局变量
print(type(h)) --> number
By Urien 2019年6月22日 00:25:41