Lua学习笔记

  1.对一个数字字符串进行算数操作时,lua会尝试将字符串转换为数字

  2.可以用[[]]包住多行字符串

  3.字符串间的连接用. .print(a..b)

  4.表的默认索引从1开始,表可以当数组使,也可以当字典使,可以随便存啥类型都行,定义方式a = {},没初始化的表是nil。

  5.函数可以存在变量里

  6.可以将任意C/C++的数据类型存到lua变量中调用

  7.lua中的变量全是全局变量,表中的和函数中的也都是,要想声明局部变量,就加个local。局部变量的作用域从声明位置开始到语句块结束。

  8.赋值语句可以同时赋予多个值,且是先计算右边的值,赋值过去,再挨个往左赋,所以想要交换a,b的值只需要a,b = b,a

  9.变量个数与值的个数不一致时以变量个数为准,变量多则补nil,少则忽略多的值。

  10.应尽量使用局部变量,访问速度更快,避免命名冲突。

  11.循环语句

-- while循环
while(true)
do
	doSomething()
end

-- for循环 数值版
for i = 1102 do
	doSomething()
end

-- for循环 泛型版
for key,val in pairs(a) do
	doSomething()
end

-- repeat until循环
repeat
	doSomething()
until(a < 20)


  12.goto语句

::somePlace::

goto somePlace

  13.Lua中的0在判断条件中为true

if(a>20)
then
	print("a>20")
elseif(a<0)
then
	print("a<0")
else
	print("a>20&&a<0")
end

  14.函数可设置为全局还是局部,默认是全局,局部加local

  15.函数返回值可以多个,以,隔开。

s,e = string.find("lerchain","rch")
print(s,e)
-- 3  5

  16.函数可接受可变数目的参数,...表示有可变数的参数,固定参数必须放到可变参数之前。

  17.可以通过select("#",...) 来获取参数的数量

local function  ave(666...)
	s = 0
	for k, v in ipairs(...)
	do
		s += v
	end
	return s/select("#",...)
end

  18. 不等于符号~=#返回变量长度,获取表的长度时要小心。

  19.string.len(),计算字符串长度。 upper、lower、find、reverse.

  20.匹配模式 %a 匹配字母

  21.数值下标越界输出nil

  22.多维数组

a[] = {}
for i=1 ,3 do
	a[i] = {}
	for j=1, 3 do
		a[i][j] = i+j
	end
end

  23. 无状态迭代器,效率更高,返回数组中每一个元素,例子ipairs,实现原理

function iter(i,a)
	i = i + 1
	if(a[i])
	then
		return i,a[i]
	end
end
function ipairs(a)
	return iter, 0 , a
end

  24. 表的赋值属于浅拷贝。

  25.table.contact(t1,",",1,2) 意为用逗号连接t1表内的前两个元素。
  table.insert(t1,5,"lalala") 意为在ti表的第五索引处增加lalala。
  table.sort(t1) table.remove(t1,pos)

  26.模块基本上就是用表的形式,创建一个文件,在里面这么写

m = {}
m.a = 1;
function m.func1()
	doSth()
end
return m

  27.使用模块时就用 require (“m”)或者定义个别名 local a = require "m"

  28.文件路径以;分隔,最后加;;代表新加的路径后面也加上原来的默认路径

  29.使用MetaTable可将table关联起来,setmetatable(table,metatable)是对指定的表设定元表getmetatable(table)获取对应元表

  30.Lua寻找表中元素会先从表里找,如果表里没有就从元表里找,如果元表的__index是个表就再从__index的表里找如此循环,如果__index是个函数就从函数的返回值里找。

  31.__index是用于查找的元方法,__newindex是用于更新的元方法,从此新赋的值会更新到__newindedx所对应的表。

  32.__calla(b),__adda+b,__tostringprint(a)等等,擅用这些元方法方为王者。

  33.协程:同一时刻只能有一个协程在运行,多个协程间共享大部分内存,只是拥有独立的堆、局部变量,主要是注重彼此的协作。协程的底层实现是线程。

  34.使用协程的几个方法

co = coroutine.create(func) //返回coroutine类型
co.resume()//开启协程
co2 = coroutine.wrap(func) //返回函数类型,调用即开启协程
co.yield()//co挂起
co2() //开启协程
print(coroutine.running())//返回正在运行的协程的协程号
print(co2.status)//返回协程当前状态

  35. io简单模式: 打开文件file = io.open(filename,+)加号是可读也可写

io.input(file) --将file作为默认输入文件
io.output(file) --默认输出文件
io.write("aaa") 
print(io.read()) --输出文件第一行    
read()里可带参数,n 读取一个数字并返回, a 当前位置读取整个文件  number number个字符。
io.close(file) --关闭打开的文件

  36.io完全模式:

file = io.open("aa","r")
file:write("...")
file:close() --关闭打开的文件
print(file:read())

  36.assert(a == 1,"a~=1") 第一个参数有问题就抛出第二个字符串。
  error("em",2) 1是默认,2是返回调用函数的函数

你可能感兴趣的:(Unity)