Lua学习笔记——基础篇

一.变量
Lua 变量类型
Lua定义变量时不需要指定变量类型,变量类型根据值来定。
	1.nil
	2.bool		
		Lua规定只有nil与false是false ,所以0是true
	
	3.number		整数,浮点数
	
	字符串类型与表类型是浅拷贝。
	4.string		字符串
		多行字符串[[hello
				i am tom
				how are you]]
		与“hello\ni am tom\n how are you”等价			
		str1 = "asdasdf".."fasdf"	..字符串连接符
	
	5.table	    :表类型
		t = {name ="tom", age = 18,false,function()print("hello\n")end}
		随机访问t[0]	t.name或者t["name"]			t[4]()调用t4的函数
		/
		如果数字与结构写法混用时,数组下标与其他结构会分开保存,利用下标访问的都是同一种类型的
		例:t = {1,2,3,name = "tom",age = 10, 4,5} 此时t[5]是5。
		
		table中变量可以不用一次指定,t.class即可向t中添加新的变量。
		
	6.function	:函数类型
		func1 = function()
			print("function is called\n");
		end
	
	7.thread		:线程类型
	8.userdata		:用于与C/C++交互的类型(void*)


二.基本操作
--注释
--[[多行注释]]--

var =var1/var2 
a = 3^4 //幂运算
a = var%10   //求余运算
a,b = 100,200 //赋值
a,b = b,a  //交换

~=   逻辑运算 (不等于) 其他与C一样
逻辑运算返回的都是bool类型

逻辑操作符 ————返回的是得到结果之前的参数值,注意and和or都是短路求值
and   or   not
print(4 and 5)      //返回5
print(nil and 13)   //返回nil
print(4 or 5)       //返回4
print(false or 5)	//返回5

+可以用于字符串与number相加	var =100+"200"  结果为300     var="100"..200  结果为“300”
str=""..200  得到“200”
+与..	常用于字符串与number类型的相互转化,也可以使用tonumber和tostring

	
三.常用函数
	0.print()函数
		print("var = ",var)
		
	1.type函数(返回值为string类型)
		var =18
		print(type(var))	
	
	
		
四.条件语句
	0.Lua没有switch case语句,只有 if
	if a==100  then
		print("asdfas")
	elseif var==200	 then
		print("asd")
	else 
		print("adfs")
	end
	
五.循环语句
0.for循环
	--for(int i=0;i<10;i++)
	for i = 0,10 do
		print(i)
	end
	
	//调整步长
	--for(int i=0;i<10;i+=2)
	for i = 0,10,2 do      //2表示步长
		print(i)
	end
	
	//遍历表
	t = {1,"hello",2,3,4,5}
	for i= 1,#t  do			//#t表示到求表中的连续相同类型数据的个数,for循环i自动++
		print(t[i])
	end	
	
	//利用ipairs遍历表
	t ={100,200,300,400,500}
	for k,v in ipairs(t) do
		print(v)
	end
	
	
1.while循环
	i=0
	while i<100 do
		print(i)
		i =i+1          //Lua没有++运算,while循环i++需要手动添加
	end
	
2.Lua没有continue操作,可以使用while嵌套if操作过滤	
	
Lua有break操作,跳出当前循环

i=0
while i<100 do
	if i==0 do
		print(i)
	end
end	


六.函数

for _,value in ipairs(t) do		//下划线表示不关心
	print(key,value)       		 //返回key是1 2 3 4 5
	print(_,value)         		//下划线表示不关心
end

0.可以返回多个参数
	function myswap(a,b)
		return b,a
	end

	c,d = myswap(c,d)
	
1.不定参数
	function my_print(a,...)
		t={...}
		for i=1,#t do
			print(t[i])
		end
		return nil
	end	

2.传值与传地址
	function func(a,b,c)
		a.name ="abc"
		b = 1000
		c = "world"
	end
	t ={name ="tom"}
	i = 10
	s ="hello"
	func(t,i,s)
	调用完毕之后 t的name变为"abc";而i仍然是10;浅拷贝传递的是地址,而i传递的是值;字符串传递的虽然是地址,但是"hello"本身并没有发生变化,而是c变量指向了别的内存。


七.Lua库函数
01基础库函数
	//001  assert(a[,message])  //方括号表示可选,assert抛出异常
	
	--执行其他Lua文件
	//002  dofile("abc.lua")     //用于多文件
	
	//003  error函数
		function func()
			error("this is error")
		end
		func()
		在error行停止执行,并提示第XX行出现错误,调用了func函数错的。

	//004		_G表示全局
		_G.a等价于a
	
	//005	getmetatable得到描述数据的数据,metatable是一个描述数据的数据。
		主要是用于table的类型数据的描述
	
	
	//006	ipairs table的迭代器,依次返回table中的数据
		t ={100,200,300,400,500}
		for key,value in ipairs(t) do
			print(key,value)        //返回key是1 2 3 4 5
			print(_,value)          //下划线表示不关心
		end
	
	
	//007	pairs 增强型ipairs,效率低些,但是可以遍历table中其他类型的参数
		t = {1,2,3,name ="tom",4,5}
		for key,value in pairs(t) do
			print(_,value)
		end

	
	//008		load	
		function add()
			return 0
		end
		func1 = load("return add")
		a=func1;
		print(a)
		执行结果:打印了一个 0

	//009		loadstring    将一个字符串当成一个可执行语句来执行
		loadstring("function func() print("loadstring function is called") end  func")
		loadstring("a=100;b =200;return a+b")


	//010	unpack函数,解包table,依次返回table中的数据(只返回最开始连续的相同类型,不会返回不同类型)
		t = {100,200,300}
		a ,b,c = unpack(t)
		print(a,b,c)

		或解包table中指定的范围
		a,b,c =unpack(t,2,3)   //从第二个开始解包,到第三个结束
		结果:a =200 ,b = 300 ,c = nil 

		unpack(t,2)   //表示从第二个开始解包,一直到table结尾
	
	
02table库函数
	001		table.concat(t[,sep[,i[,j]]])    //sep表示分割符,i,j表示起始与结束的位置。
	连接table中所有的元素变成一个string类型的变量(只可以连接number与string类型的变量)
		t = {100,200,300}
		str = table.concat(t);
		
		table.concat(t,":",2,3)
	
	002		table.insert(t,[pos],value) 		在指定的位置插入数据。默认插入到最后面
	
	003     table.maxn(t)     求table中相同类型数字的最大下标
		t ={100 ,200,300,400}
		t[10] =20
		table.maxn(t)   得到结果:10  而#t为4
	
	004		table.remove(t)  删除最后一个元素
			table.remove(t,3) 删除第三个元素
	
	005		table.sort(t[,comp])
		table.sort(t,function(a,b) return a io.input():lines(); 读取默认输入设备的内容,但结束时不关闭文件
  	如:for line in io.lines("main.lua") do
  	print(line)
  	end

  4、io.open (filename [, mode])
  	功能:按指定的模式打开一个文件,成功则返回文件句柄,失败则返回nil+错误信息
	  mode:
	  "r": 读模式 (默认);
	  "w": 写模式;
	  "a": 添加模式;
	  "r+": 更新模式,所有之前的数据将被保存
	  "w+": 更新模式,所有之前的数据将被清除
	  "a+": 添加更新模式,所有之前的数据将被保存,只允许在文件尾进行添加
	  "b": 某些系统支持二进制方式

  5、io.output ([file])
  	功能:相当于io.input,但操作在默认输出文件上

  6、io.popen ([prog [, mode]])
  	功能:开始程序prog于额外的进程,并返回用于prog的文件句柄(并不支持所有的系统平台)

  7、io.read (...)
  	功能:相当于io.input():read

  8、io.tmpfile ()
  	功能:返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除

  9、io.type (obj)
  	功能:检测obj是否一个可用的文件句柄
  	返回:
	  "file":为一个打开的文件句柄
	  "closed file":为一个已关闭的文件句柄
	  nil:表示obj不是一个文件句柄

  10、io.write (...)
  	功能:相当于io.output():write

06文件操作函数
  11、file:close()
	  功能:关闭文件
	  注:当文件句柄被垃圾收集后,文件将自动关闭。句柄将变为一个不可预知的值

  12、file:flush()
  	功能:向文件写入缓冲中的所有数据

  13、file:lines()
	  功能:返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,但不关闭文件
	  如:for line in file:lines() do body end

  14、file:read(...) 	
		功能:按指定的格式读取一个文件,按每个格式函数将返回一个字串或数字,如果不能正确读取将返回nil,若没有指定格式将指默认按行方式进行读取
	  格式:
	  "*n": 读取一个数字
	  "*a": 从当前位置读取整个文件,若为文件尾,则返回空字串
	  "*l": [默认]读取下一行的内容,若为文件尾,则返回nil
	  number: 读取指定字节数的字符,若为文件尾,则返回nil;如果number为0则返回空字串,若为文件尾,则返回nil;

  15、file:seek([whence][,offset])
	  功能:设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息
	  参数
	  whence:
	  "set": 从文件头开始
	  "cur": 从当前位置开始[默认]
	  "end": 从文件尾开始
	  offset:默认为0
	  不带参数file:seek()则返回当前位置,file:seek("set")则定位到文件头,file:seek("end")则定位到文件尾并返回文件大小

  16、file:setvbuf(mode,[,size])
	  功能:设置输出文件的缓冲模式
	  参数
	  mode:
	  "no": 没有缓冲,即直接输出
	  "full": 全缓冲,即当缓冲满后才进行输出操作(也可调用flush马上输出)
	  "line": 以行为单位,进行输出(多用于终端设备)
	  最后两种模式,size可以指定缓冲的大小(按字节),忽略size将自动调整为最佳的大小
  17、file:write(...)
		功能:按指定的参数格式输出文件内容,参数必须为字符或数字,若要输出其它值,则需通过tostring或string.format进行转换	
	

07 os库
	os.clock()
	
	os.date()
	
	os.difftime(t1,t2)
	
	os.execute([command])           //有用!

	os.exit



	

你可能感兴趣的:(Lua,lua)