1.变量定义:

  num = 2+2

  num = "2"+2

  num = "2"+"2"

  str = "string"..'string'

  str = [[

      string

      ]]

2.定义表格:

  tab = {k="kk",v="vv"}

  tab = {k="kk","vv"}  

  tab = {"kk"."vv"}

  tab = {}

    tab["key"] = "xiaolang"

    print(tab["key"]) xiaolang

       print(tab.key) xiaolang

3.程序循环:    break跳出

  for循环:

  for i=1,102 do

    print(i)

  end      13579

 

  for i=1,5 do

  j=j+i

    print(j)

  end 1361015

 

  t = {a=100,10,20,[5]=30}

  for key,value in ipairs(t) do

     print(key,value)

  end    1 102 20  ipairs遇到nil停止,需要下标、用于迭代 array 形式的 table

  

  for key,value in pairs(t) do

     print(key,value)

  end 1 102 20,a 1005 30  pairs完全遍历, pairs 可以用来迭代字典形式的 table

 

  while循环:

  while(i<5)

  do

    print(i)

    i=i+1

  end

 

  repeat...until 循环:

  i=0

  repeat

      print(i)

  i=i+1

  until( i>5 )

 

4.Function方法+If判断:

  function factorial(n)

       if n == 0 then

           return 1

       else

           return n * factorial(n - 1)

       end

  end

  print(factorial1(5)) 120

 

5.协同程序(coroutine)+ 线程(thread):

  在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

  线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

  userdata(自定义类型):

  userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

 

6.模块编辑:

  -- 文件名为 module.lua ,之后定义一个名为 module 的模块

  module = {}

  module.constant = "常量"

  -- 定义一个函数

  function module.function1()

      io.write("公有函数!")

  end

  local function function2()

      print("私有函数!")

  end

  function module.function3()

      function2()

  end

  return module

  调用模块:

  require("module")

  print(module.constant)

  module.function3()

 

7.Lua 查找一个表元素(Metatable)时的规则:

  1.在表中查找,如果找到,返回该元素,找不到则继续

  2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。

  3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 123;如果 __index 方法是一个函数,则返回该函数的返回值。

  初始化:mytable = setmetatable({},{}) >>>>>    mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })

      返回对象元表:getmetatable(mytable)    >>>>>    print(mytable.key1,mytable.key2)

  

8.定义原方法:__add    (两个英文下划线)

  function table_maxn(t)

      local mn = 0

      for k, v in pairs(t) do

          if mn < k then

              mn = k

          end

      end

      return mn

  end

  -- 两表相加操作 ****重要操作****

  mytable = setmetatable({ 1, 3, 2 }, {

    __add = function(mytable, newtable)

      for i = 1, table_maxn(newtable) do

        table.insert(mytable, table_maxn(mytable)+1,newtable[i])

      end

      return mytable

    end

  })

  secondtable = {6,5,4,7}

 

  mytable = mytable + secondtable

          for k,v in ipairs(mytable) do

  print(k,v)

  end 1  1,2  3,3  24  65  5,6  47  7

 

9.coroutine:(协程逻辑)

  local newProductor

  function productor()

       local i = 0

       while true do

            i = i + 1

            print("aaa")

            send(i)     -- 将生产的物品发送给消费者

            print("fff")

       end

  end

  j=0

  function consumer()

       while j<10 do

          j=j+1

            local i = receive()     -- 从生产者那里得到物品

            print(i)

       end

  end

 

  function receive()

    print("ccc")

       local status, value = coroutine.resume(newProductor)

       return value

  end

 

  function send(x)

    print("bbb")

       coroutine.yield(x)     -- x表示需要发送的值,值返回以后,就挂起该协同程序

  end

 

  -- 启动程序

  newProductor = coroutine.create(productor)

  consumer()

posted on 2020-01-10 14:54  _萧朗  阅读(218)  评论(0编辑  收藏  举报