本文为xiedantibu在学习lua程序设计的笔记
,转载请注明作者及出处!
###目录
—-
type()-返回类型名称
nil(空)
boolean(布尔)
number(数字)
string(字符串)
table(表)
function(函数)
userdata(自定义类型)和thread(线程)
####type()-返回类型名称 — 在Lua中有8种基础类型:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)和tabel(表)
函数type可根据一个值返回其类型名称。
b=nil
print(b) --nil
print(type("hello")) --string
print(type(10.4*3)) --number
print(type(print)) --function
print(type(type)) --function
print(type(true)) --boolean
print(type(nil)) --nil
print(type(type(x))) --string
print(type(a)) --nil(a 尚未初始化)
a=10
print(type(a)) --number
a="a string!!"
print(type(a)) --string
a=print --lua的变量没有预定义的类型,任何变量都可以包含任何类型的值
a(type(a)) --function --- <a id='nil' name='nil'> </a> ####[nil-空](#top) --- nil是一种类型,只有一个值nil.他主要功能是用于区别其他任何值(无效值)。全局变量在第一次赋值前的默认值是nil,将nil赋值于一个全局变量等同于删除他
####boolean(布尔)
—
boolean类型有两个可选值:false和true。lua将值false
和nil
视为假,而将除此之外的其他值视为真。将数字0和空字符串也都视为真
####number(数字) — number类型用于表示实数。Lua没有整数类型,Lua中的数字可以表示任何32位整数,而不产生四舍五入的错误。
####string(字符串)
—
Lua中的字符串通常表示“一个字符序列”。Lua完全采用8位编码,任何二进制数据存储到一个字符串中。
Lua的字符串是不可变的值。不能像C语言中那样直接修改字符串的某个字符,而是应该根据修改要求来创建一个新的字符串,如:
b=string.gsub(a,"one","another");
print(a) --one string(原来的string 还是没有变化)
print(b) --another string
#####字符串的表示形式.
Lua的字符串和其它对象(如table或者函数)都是自动内存管理机制所管理的对象,无须担心字符串的内存分配和释放。
字母字符串需要以一对匹配的单引号或者双引号来界定,如:
a="a line"
b='another line' 还可以用一对匹配的双方括号来界定一个字母字符串,就像写“块注释”那样,以这种形式书写的字符串可以延伸多行。如果字符串的第一个字符是一个换行字符,那么Lua就好忽略。如:
local page = [[
<html>
<head>
<title>xiedantibu</title>
</head>
<body>
<a href="http://blog.xulingmin.com">lua</a>
</body>
</html>
]]
print(page) 有时字符串可能需要包含这样的内容:a=b[c[i]]。或者,可能需要保护已经被注释掉的代码。为了应付这种情况,需要在两个左方括号间加上任意数量的等好,就像`[===[`,右方括号加上相等数量的等号`]===]`,这样就可以在不加转义的情况下,直接嵌入任意的字符串内容。同样的道理,注释也可以这样。如以`--[=[`开始,`]=]`结束。 #####数子与字符串的转换.
Lua在设计的时候提供了运行的时数字和字符串的自动转换:
print("10"+1) --11
print("10+1") --10+1
print("-5.3e-10"*"2") --1.06e-09
print("hello"+1) --报错(不能转换"hello")
自动转换虽好,但可能我们期望一个字符串却得到一个数字时,字符串和数字是两样不同的东西。比较运算10==“10”
总为false,因为10为一个数字,而“10”是一个字符串。
######字符串转换成数字
line=io.read() --读取一行
n=tonumber(line) --尝试将它转换成一个数字,失败返回nil
if n==nil then
error(line .. " is not a valid number")
else
print(n*2)
end ######数字转换成字符串
print(10 == "10") --false
print(tostring(10) == "10") --true
print(10 .. "" == "10") --true(".."是字符串连接操作符。当直接在一个数字后面输入他的时候,必须要一个空格来分隔它们) ######获取该字符串的长度 在字符串前放置操作符“#”来获得该字符串的长度:
a="hello"
print(#a) --5
print(#"good\0bye") --8 --- <a id='table' name='table'> </a> ####[table(表)](#top) --- table类型实现了“关联数组”。“关联数组”是一种特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或其他类型的值(除了nil)来索引它。同时,table没有固定的大小,可以动态的添加任意数量的元素到一个tabel中。 在Lua中,table既不是“值”,也不是“变量”,而是对象。可以将table想象成一种动态分配的对象,程序仅持有一个它们的引用(指针)。table的创建是通过“构造表达式”完成的,最简单的构造表达式就是{}。
local a = {} --创建一个table,并将它的引用存储到a
k = 'x'
a[k] = 10 --新条目,key="x",value=10
a[20] = 'great'
print(a['x']) --10
k=20
print(a[k]) --'great'
a['x']=a['x']+1
print(a['x']) --11
table永远是匿名的,一个引用table的变量与table自身之间没有固定的关联性,例如以下代码:
local a = {} --创建一个table,并将它的引用存储到a
a['x'] = 10
b = a --b与a引用了同一个table
print(b['x']) --10
b['x'] = 20
print(a['x']) --20
a=nil --现在只有b还在引用table
print(a['x']) --报错了
b=nil --再也没有table的引用,当一个程序再也没有对一个table的引用时,lua的垃圾收集器最终会删除该table 当table的某个元素没有初始化时,它的内容就是nil;另外还可以像全局变量一样,将nil赋予table的某个元素来删除该元素
#####语法糖 在Lua中,a[“name”]这种形式的写法等价于a.name,如:
local a= {}
a.name="xiedantibu"
print(a['name']) --xiedantibu 等价于a.name a.x和a[x],前者表示a['x'],表示以字符串'x'来索引table,而后者是以变量x的值来索引table,下面来看例子:
local a = {}
x='y'
a[x] = 10
print(a[x]) --10 等价于a.y
print(a.x) --nil 等价于a['x']
print(a.y) --10 等价于a['y'] 在Lua 5.1中,长度操作符“#”用于返回一个数组或线性表的最后一个索引值。
-- 读取10行内容,并保存到一个table中
local a = {}
for i=1,10 do
a[i] = io.read() --等价于a[#a+1]=io.read
end
-- 打印所有的行
for i=1, #a do
print("序号" .. i,a[i])
end
print("================")
print(a[#a]) --打印列表a的最后一个值
a[#a] = nil --删除最后一个值
数组实际上是一个tabel,所以关于其大小的概念可能会有陷阱啊,以下数组的大小多少呢?
local a={}
a[1000]=1
print(#a) --0 在Lua中,对于所有未初始化的元素的索引结果都是nil。Lua将nil作为界定数组结尾的标志。当一个数组有“空隙”时,即中间含有nil时,长度操作符会认为这些nil元素就是结尾标记。在上诉例子中因为a[1] = nil,所以,对于上述代码的输出应该是0。所以,在处理table的时候,需要考虑这个问题。那么对于含有nil的table,如何获取它的长度呢?我们可以使用table.maxn,它将返回一个table的最大正索引数:
local a={}
a[1000]=1
print(table.maxn(a)) --1000 --- <a id='function' name='function'> </a> ####[function-函数](#top) --- 在Lua中,函数是作为‘第一类值’来看待。这表示函数可以存储在变量中通过参数传递给其他函数,当然也可以作为其他函数的返回值。 Lua既可以调用以自身Lua语言编写的函数,也可以调用以C语言编写的函数。Lua中所有的标准库都是用C语言写的。
####userdata-自定义类型和thread-线程
—
由于userdata类型可以将任意的C语言数据存储到Lua变量中。在Lua中,这种类型没有太多的预定义操作,只能进行赋值和相等性测试。userdata用于表示一种由应用程序或C语言库所创建的新类型。。
thread主要用于“协同程序”,在之后章节继续学习吧…
####END
青春是一场大雨,即使感冒了,还盼回头再淋一次......微笑永远是一个人身上最好看的东西...