总结一下Lua编程中常用到的知识点

知识点

  1. “#”用于求长度,例如#+字符串/表

  2. 表的声明方式: table = {["a"] = "Lua",["b"] = "C#",["c"] = "C++"}

     	或者 table = { a = "Lua" , b = "C#" , c = "C++" }
     		如果是数字key则中括号不能省略
    
  3. table的默认索引是从 1 开始

  4. 可以用 2 对方括号 "[[]]" 来表示"一块"字符串。(类似C# 中的@)

  5. if后必跟一个then语句

  6. Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...) 表示函数有可变的参数。

  7. 可变参数中 arg 参数的最后一个数为参数的个数 ,使用 local arg = {...}来取得参数

  8. pairs 和 ipairs异同

    同:都是能遍历集合(表、数组)
    异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
    pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。

协程

    • 定义协程函数,将方法放在 coroutine.create()中

    使用 coroutine.resume()启动或者继续协程

    • 定义协同函数,将函数放在 co = coroutine.wrap()中的

    使用 co(arg1,arg2)启动

    • 暂停协同函数使用 coroutine.yield(),在yield中的参数可以传递出来
    • 使用 coroutine.status()获取线程状态
  1. 执行完的协同函数不能复活,必须重新创建

面向对象

1.定义类

    Person = {name ="",age = 18}
    function Person:eat()
		print(self.name)
	end
	--当使用 : 来定义函数的时候可以使用 self 来获取当前调用者,并且调用必须使用 : 才能使用
    a = Person
    a:eat() 
    a.eat(a)

2.构造函数

    function Person:new()       
		local t = {}
		setmetatable(t,{__index = self} --当索引不存在会查找元表中的索引
		return t
	end

3.继承实现

    Student = Person:new()
	Student.grade = 1
	--Student相当于Person的子类
	stu1 = Student:new()

#元表metatable
8. metatable
使用__metatable可以保护元表,禁止用户访问元表中的尘成员或者修改元表

  1. __index

    1. 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

    2. 如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。

  2. __newindex
    __newindex 元方法用来对表更新,当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。

  3. __add
    __add 键包含在元表中,并进行相加操作。

  4. __call
    __call 元方法在 Lua 调用一个值时调用.
    __call = function(mytable,arg) --arg位参数 10
    mytable(10)

  5. __tostring
    __tostring 元方法用于修改表的输出行为。print(mytable)

  6. rawget 和 rawset
    如果不想在访问一个table时涉及到它的__index方法,可以使用函数rawget。调用rawget(t,i)
    就是对table t进行了一个“原始(raw)”的访问,也就是一次不考虑元表的简单访问。一次原始访问并不会加速代码的执行。
    调用rawset(t,k,v)就可以不涉及任何元方法而直接设置table t中与key k向关联的value l。