lua 语句之间可以用分隔符也可以不用分隔符,LUA的语法中,代码中的换行不起任何作用
例如:一下四个程序块都是合法的,并且完全等价
a=1
b=a*2
a=1
b=a*2
a=1; b=a*2
a=1 b=a*2 --有点难看,但却是合法的
用lua解释器解释lua脚本命令
% lua hello.lua
II 词法
Lua中的标识符可以是由任意字,数字和下划线构成的字符串,但不能以数字开头。
注意:应该避免使用以一个下划线开头并跟着一个或多个大写字母(例如:“_VERSION”) 的标识符,Lua将这类标识符保留用作特殊用途。
通常保留标识符“—”(一个下划线)作为“亚变量”使用。
Lua的保留字都有哪些呢?
and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while
III 代码注释
--行注释
--[[......--]] 多行注释
IV.全局变量和局部变量
在lua中默认变量都是全局变量,当需要局部变量的时候可以用关键字:local
在lua中访问一个未初始化的变量不会引发错误,访问结果是一个特殊的值nil
例如: print(b) --nil
通常没有必要删除一个全局变量。如果一个变量只有较短的生存周期,那么就应该使用局部变量。
但是如果一定要删除某个全局变量的话,只需要将其赋值为nil
2. 类型与值
Lua是一种动态类型的语言。在语言中没有类型的定义的语法,每个值都携带了它自身的类型信息,也就可以这样理解
你为这个变量赋予什么类型的值,那么这个变量就是什么类型的变量
Lua中共有8种基础类型: nil (空), boolean, number string userdata function thread table(表)
函数type可根据哦一个值返回其类型名称
print(type("hello world")) -->string
注意:type(x) type的返回类型为string
变量没有预定义的类型,任何变量都可以包含任何类型的值
print(type(a)) --nil
a=10
a="a string!"
print(type(a))
a=print
a(type(a)) -->function
类型:Boolean :false/true Lua将值false和nil视为“假” ,而将出此之外的其他值视为"真“。
例子:
a="one string"
b=string.gsub(a,"one","another") --修改字符串的一部分
print(a) -->one string
print(b) -->another string
Lua的字符串和其他Lua对象(例如:table或函数等)一样,都是自动内存管理机制,所管理的对象。这表示无需担心字符串的分配和释放,Lua处理这些事情。一个字符串可以小到只包含一个字母,也可以大到包含整本书。Lua能够高效地处理长字符串。在Lua程序中操作100K或1M的字符串是很常见的。
字符串的书写方式:a="a line" b='another line'
另外,还可以用一对匹配的双方括号来界定一个字母字符串,就像写"块注释” 那样。以这种形式书写的字符串可以延伸多行,Lua
不会解释其中的转义序列。此外,如果字符串的第一个字符是一个换行字符,那么Lua会忽略它。这种写法对于书写那种含有程序
代码的字符串尤为有用。如下列:
page[[
<html>
<head>
<title>An HTML Page</title>
</head>
<body>
<a href="http://www.antknow.net">Lua</a>
</body>
</html>
]]
2) 也可以用[===[ ....]===] 相同数量的等号,就可以在不加转义的情况下,直接嵌入任意的字符串内容了
这套机制也同样适用于注释。例如,以“--[=[........]=] 如此便简化了注释那些”已经包含了注释块“的代码。
3) Lua 提供了运行时的数字与字符串的自动转换。在一个数字字符串上,应用算术操作时,Lua会尝试将这个字符串转换成一个数字
print("10"+1) --> 11
print("hello"+1) -->错误,(不能转换“hello”)
4) print(10 .. 20) --》1020
在lua中,“.."是字符串连接操作符。当直接在一个数字后面输入它的时候,必须用一个空格来分割他们。
如今,人不能确定在lua的设计中,这些自动的强制转换是否算一项好的设计,建议,最好不要依赖他们。
如果需要显示地讲一个字符串转换成数字,可以使用函数:tonumber.这个字符串的内容不能表示一个正确的数字时,tonumber将返回nil
line=io.read() ----读取一行
n=tonumber(line) ---尝试将他转换为一个数字
if n==nil then error(line .. " is not a valid number")
else
print(n*2)
end
5) 若要将一个数字转换成字符串,可以调用函数 tostring,或者将该数字与一个空字符串相连接:
print(tostring(10)=="10") -->true
print(10 .. "" =="10") --true
6) 在lua 5. 中,可以在字符串前放置操作符”#" ,来获得该字符串的长度:
a="hello"
print(#a) -->5
print(#"good\0byte") -->8
2.5 table(表)
table类型实现了”关联数组“。"关联数组” 是一种具有特殊索引方式的数组,可以用除了nil之外的任何类型来索引它。
table没有固定大小,动态类
Lua也是通过table来表示模块,包,和对象的。当输入io.read的时候,其含义是“io模块中的read函数”。对于Lua而言,这表示“使用字符串read作为key,来索引table io.
table的创建是通过”构造表达式“完成的,最简单的构造表达式就是{}
table永远是”匿名的“,一个持有table的变量与table自身之间没有固定的关联性
当一个程序再也没有对一个table的引用时,Lua的垃圾收集器最终会删除该table,并复用它的内存
当table的摸个元素没有初始化时,他的内容就为nil
例如:
a.x=10 --->等同于a["x"]=10
print(a.x) -->等同于print(a["x"])
--打印所有的行
for i=1, #a do
print(a[i])
end
一下是几种,长度操作符在Lua中的习惯写法
print(a[#a]) --->打印列表a的最后一个值
a[#a]=nil -->删除最后一个值
a[#a+1]=v -->将v添加到列表末尾
另一种方法来读取一个文件的前10行
a={}
for i=1, 10 do
a[#a+1]=io.read()
end