Lua--基本语法(table表和泛型for)

Lua–基本语法(表的构造式)

回顾上节课,先来两个问题

print("12" + 34 .. "56") -- "4656"

三目运算符:

	a and b or c(b不能为假)

– 交换第一个和最后一个元素

tb[1], tb[5] = tb[5], tb[1]
一:table
  • 1.表的构造式:{}

  • 2.列表风格:数组

      1.元素的访问:表名[下标],下标从1开始
      2.求长度#:1.如果下标为1的元素为nil,则长度为0
    
  • 3.记录风格:键值对(哈希表)

      1.初始化:{键名 = 值}  
      2.元素的访问:1.表名["键"]    2.表名.键(推荐)
    
  • 4.混合风格:列表和记录风格的混合

      1.求长度#:只能求数组部分长度
    

特点:

1.长度可变,类型可以不相同的结构
2.没有初始化或者赋值的元素默认为nil
3.table底层实现就是数组和哈希表
4.表是一种引用类型,一个表用另一个表赋值,表示指向同一张表
5.Lua内存回收机制是通过GC(垃圾回收机制(标记清除法))进行回收
二 .泛型for:
for 变量1,变量2 in 表达式1,表达式2,表达式3 do
   循环体
end
  • ipairs和pairs都会返回三个值,对应泛型for的三个表达式

  • 区别:

      1.ipairs遇到元素值为nil则停止循环,pairs遇到nil继续循环;
    
      2.ipairs只能遍历table的数组部分,pairs可以遍历数组和键值对部分(顺序不一定与     书写的顺序一致);
    
三.table函数:

1.insert:插入元素(后面的元素往后移)

参数:1.表 2.下标位置(可不传,默认为最后一个)3.值

2.remove:移除元素 (后面的元素往前移)

 参数:1.表 2.下标位置(可不传,默认为最后一个)
 返回值:删除元素的值

示例:

local tb = { 1, 2, 3 }
table.insert(tb, 2, 4) -- 在下标为2的位置插入元素4
table.remove(tb, 1) -- 删除下标为1的元素
for i, v in ipairs(tb) do
   print(v)
end

删除tb中的所有偶数

  • 1:从前往后删

      local tb = { 1, 2, 2, 3, 4, 4 }
    
      local i = 1
      while i <= #tb do
         if tb[i] % 2 == 0 then
         table.remove(tb, i)
    else
       i = i + 1
     end
      end
    
  • 2:从后往前删

      for i = #tb, 1, -1 do
      if tb[i] % 2 == 0 then
    	  table.remove(tb, i)
    	  end
      end
    
      for i = 1, #tb do
    print(tb[i])
      end
    

示例:

local tb = { 1, 2, 3, 4, 5 } -- 初始化
tb = { 6, 7, 8, 9, 10 } -- 重新创建表
tb[6] = 11-- 添加元素
tb[8] = 13
print(tb[7]) -- nil
print(#tb) -- 8
local tb1 = {[1] = 0, [2] = 22, [3] = 33, [5] = 66 }
-- tb1[0] = -11

二维数组

local tb2 = { { 1, 2, 3 }, { 4, 5, 6 } }
print(tb2[2][3]) -- 6

local size = { w = 100, h = 200 }
print(size["w"])
print(size.w)
size.l = 1-- 添加元素
size.getArea = function() -- 给size添加求面积的方法
return size.w * size.h
end

function size.getArea()
return size.w * size.h
end
print(size.getArea())


local tb = { "x", "z", x = 1, y = 2, z = 3 }
print(#tb) -- 2
print(tb[tb.x]) -- "x"
print(tb[tb[tb.x]]) -- 1
print(tb[3]) -- nil

local tb = { 11, 22, 33, 44, 55, x = 1, y = 2 }
tb[7] = 77
local tbCopy = {}

遍历列表风格

for i = 1, #tb do
print(tb[i])
end

1.ipairs

	for i, v in ipairs(tb) do
   print(i, v) -- 下标,值
	end

2.pairs

	for k, v in pairs(tb) do
	--print(k, v) -- 键,值
   tbCopy[k] = v  -- 用值给对应的键赋值
	end

	for k, v in pairs(tbCopy) do
    print(k, v)
	end

示例:

local tb = { 1, { x = 2 }, "hello" }
print(#tb) -- 3
print(tb[2]) -- table地址
print(#tb[2]) -- 0

local tb = { 1, "x", x = { 1, 2, y = 2 } }
print(#tb) -- 2
print(tb[3]) -- nil
print(#tb[tb[2]]) -- 2
print(tb["x"]["y"]) -- 访问y
print(tb.x.y) -- 访问y
print(tb.x[2])-- 访问x中的2值

local tb = { 1, 2 }
local tb2 = tb -- 指向同一张表
tb2[1] = 11
print(tb[1]) -- 11

实现计数器:

local tb = { 1, 2, 2, 1, 4, 5, 6, 7, 4, 8, 10, 10, 1, 2 }
local counter = {}
counter.size = #tb -- 添加size键值
-- 初始化数量为0
for i = 1, 10 do
counter[i] = 0
end

for i = 1, #tb do
local value = tb[i]
counter[value] = counter[value] + 1
end

遍历table中的所有方法

for k, v in pairs(table) do
  print(k, v)
end

习题、

1.table的随机打乱-- 
2.定义一个牌的表,分成3份(17),cards剩余底牌-- 
3.table的函	数:concat/sort(参数/返回值/例子)
(习题答案下期揭晓,欢迎点赞关注加收藏哟)

你可能感兴趣的:(Lua)