table是lua中的一种"数据/代码结构",可以用俩创建不同的"数据类型"
lua语言中的数组其实就是table类型

array = {, , , , }
print(type(array)) --table

table基本使用:
1.初始化table
  table 表名 = {}

myTable = {}

2.给table赋值
  数组方式:以角标的方式进行赋值,索引从1开始
  键值对方式

myTable[] = "baidu"
myTable[] = "taobao"
myTable[] = "jd"
myTable["a"] = "asd"
myTable["xxx"] = "xxx"

迭代器方式遍历table:如果是数组用ipairs,如果是键值对,用pairs
for key, value in ipairs(表名) do
  代码体
end

for key,value in pairs(myTable) do
  print(key,value)
end

table相关方法
1.增加元素 table.insert(表名,[位置],值)
  往指定位置增加元素,如果不写元素,默认往最后位置增加
  这个方式适合"数组",不太适合"键值对"
  键值对就用:表名['键']=值 的方式添加
2.移除元素 table.remove(表名,[位置])
  如果超出范围,不会报错也不会移除任何元素
  这个方式适合"数组",不能用于"键值对"
  键值对就用:表名['键']=nil 的方式移除
3.获取长度 table.getn(表名)
  这个方式适合"数组",不能用于"键值对"

table.insert(myTable, , "toutiao")
table.insert(myTable, "")
myTable["abc"] = "abc" table.remove(myTable)
myTable["xxx"] = nil for key,value in pairs(myTable) do
print(key,value)
end

模块:
将一些常用的函数封装到一个独立lua脚本中,然后提供给其他的lua脚本访问使用,这种方式在lua中叫做模块
模块当中基本的成员就是变量和函数
类似于c#中的静态工具类
lua当中的模块,在语法格式上类似于命名空间,需要引入才能使用

模块的基本使用:
  创建一个新的lua脚本,并命名
  初始化模块:模块其实也是table的代码格式,说白了就是初始化一个table
  在模块中定义变量和函数
  模块的最后要写return模块名
  **在定义变量和函数的时候,名称前面必须加"模块名."
  **最终格式:模块名.变量名 模块名.函数名

--初始化模块
testModule = {} --定义一个变量
testModule.name = "ABCD" --定义函数
function testModule.add(a, b)
return a + b
end function testModule.sub(a, b)
return a - b
end --结束模块
return testModule

使用模块:
  引入模块 require("模块名") 或者 require "模块名"
  访问变量: 模块名.变量名
  访问方法: 模块名.函数名

--引入指定模块
require("testModule") --访问模块中的变量
print(testModule.name)
testModule.name = "abcd" --可以修改模块中变量的值
print(testModule.name) --访问模块中的函数
a =
b =
print(testModule.add(a,b))
print(testModule.sub(a,b))

Metatable元表
如果想同时操作两个table,就需要让两个table之间发生"关联"
元表就是让两个表之间产生"附属"关系,只需要操作主表,就可以间接的操作元表

元表基本操作
1.基本语法
实例化两个普通表A,B
关联两个表,将表B设置成表A的元表:setmetatable(表A, 表B)

getmetatable(表名)
如果表名有元表,就返回元表的类型和地址;如果没有元表,返回nil

可以直接通过"表名.键名"访问表A中的成员,但是元表内的成员是无法访问到的,会返回nil

我们需要设置元表的"__index索引",让这个索引指向元表自身:
元表名.__index = 元表名 (两个下划线)

设置完__index索引后,我们再使用"表名.键名"访问成员,如果表A中没有,就会自动访问表B中的成员

__index 元方法

当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键

如果__index包含一个表格,Lua会在表格中查找相应的键。

tableA = { name = "tableA", age =  }       --主表
tableB = { gender = "男", address = "成都" } --元表/子表
--设置元表
setmetatable(tableA, tableB) --tableB就是tableA的元表 print(getmetatable(tableA)) --判断tableA是否有元表 print(tableA.name)   --tableA
print(tableA.gender) --nil 无法直接访问元表的成员 tableB.__index = tableB --设置元表的__index索引
print(tableA.gender)   --男 A中没有该成员,自动访问元表中的成员数据

table本身是引用型数据
类:就是初始化一个table
类中的字段:在table的{}内进行定义,可以指定初始值
类中的方法: 类名:方法名
self关键字:类似于c#中的this

访问对象中的字段: 对象名.字段名 (.号)
访问对象中的方法: 对象名:方法名 (:号)--初始化一个类

Person = { name, age, gender, address = "中国" } --在Person类中模拟字段

--模拟构造方法
function Person:New(name, age, gender, address)
  local obj = {} --初始化一个新表
  setmetatable(obj, self) --把当前的类[表]设置为新表的元表
  self.__index = self   --指定元表的__index索引   self.name = name
  self.age = age
  self.gender = gender
  self.address = address   return obj
end --模拟一个方法
function Person:Show()
  print(string.format("name:%s,age:%s,gender:%s,address:%s",self.name, self.age, self. gender, self.address))
end --实例化一个对象
cxk = Person:New("cxk",,"男","北京")
cxk:Show() --name:cxk,age:100,gender:男,address:北京

继承关系模拟

--创建一个动物类
Animal = { name }
--构造方法
function Animal:New(name)
local obj = {}
setmetatable(obj, self)
self.__index = self
self.name = name
return obj
end
--普通方法
function Animal:ToString()
print(self.name .. " ToString")
end --子类继承父类
Cat = Animal:New(nil)
--子类的构造方法
function Cat:New(name)
local obj = Animal:New(name)
setmetatable(obj, self)
self.__index = self
--self.name = name
return obj
end
--子类的普通方法
function Cat:Eat(food)
print(self.name .. " eat " .. food)
end --通过子类实例化对象
jfm = Cat:New("jfm")
jfm:ToString()
jfm:Eat("food")

加载其他文件:

dofile("[路径]脚本名.lua")
如果当前脚本和加载的脚本在同一文件夹下,只需写脚本名
如果当前脚本和加载的脚本不在同一文件夹下,需要写路径
路径..\\表示上一级目录 \\两个斜杠其中一个表示转义符
dofile("aaa\\bbb\\x.lua")
dofile("..\\aaa\\bbb\\x.lua")

Animal.lua:

Animal = { name }

function Animal:New(name)
local obj = {}
setmetatable(obj, self)
self.__index = self
self.name = name
return obj
end function Animal:ToString()
print(self.name .. " ToString")
end

Person.lua

Person = { name, age, gender, address }

function Person:New(name, age, gender, address)
local obj = {}
setmetatable(obj, self)
self.__index = self
self.name = name
self.age = age
self.gender = gender
self.address = address
return obj
end function Person:ToString()
print(self.name, self.age, self.gender, self.address)
end

Program.lua

dofile("Animal.lua")
dofile("Person.lua") tom = Animal:New("汤姆")
tom:ToString() mk = Person:New("mk", , "男", "北京")
mk:ToString()

lua学习笔记2--table的更多相关文章

  1. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

  4. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  5. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  6. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  7. Lua学习笔记(二):基本语法

    Lua学习指南:http://www.lua.org/manual/ 首先我们要明确的一点是:在Lua中,除了关键字外一切都是变量. Lua关键字 可以查看这个地址:http://www.lua.or ...

  8. Lua 学习笔记(十一)元表与元方法

    在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符 ...

  9. Lua 学习笔记(十)数据结构

    在Lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础.其他语言提供的数据结构,如数组.记录.线性表.队列.集合等,在Lua中都可以通过table来表示.而且使用Lua实现这些数据 ...

  10. Lua 学习笔记(二)语法、类型、值

    首先Lua执行的每一段代码都称之为“程序块”,一个程序块也就是一连串的语句或命令,例如一个源码文件或一行代码.Lua语句之间并不需要分隔符,如代码中的换行就不起任何作用,当然为了养成编码习惯当两条或者 ...

随机推荐

  1. RabbitMQ概要

    安装: 1.Erlang安装 安装RabbitMQ需要先安装Erlang,这里选择otp21.2-win-64下载完成后安装 资源: http://www.erlang.org/downloads 2 ...

  2. 【EXE报错】win10运行C#程序保存报错:HTTP 无法注册URL ,进程不具有此命名空间的访问权限

    在win10系统运行C#程序出现以下报错 异常信息 [1]异常信息:HTTP 无法注册 URL http://+:13000/Core/Real/HandheldService/.进程不具有此命名空间 ...

  3. HDU 1512 Monkey King(左偏堆)

    爱争吵的猴子 ★★☆ 输入文件:monkeyk.in 输出文件:monkeyk.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在一个森林里,住着N只好斗的猴子.开始,他们各 ...

  4. node中的crypto内置模块

    crypto模块的目的是为了提供通用的加密和哈希算法.用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢.Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaS ...

  5. codeforces gym #101161G - Binary Strings(矩阵快速幂,前缀斐波那契)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: $T$组数据 每组数据包含$L,R,K$ 计算$\sum_{k|n}^{}F(n)$ 定义 ...

  6. mac -bash: ll: command not found

    在linux系统下我们经常使用ll.la命令.但在mac系统时缺没有. 提示:-bash: ll: command not found. 这是因为ll.la不是真的命令,而是一些常用命令和参数搭配的别 ...

  7. AT3912 Antennas on Tree

    AT3912 Antennas on Tree %%zzt 只能考虑性质了. 把最后选择的k个点的连通块求出来,连通块内部的点表示都是互异的 连通块外部的点只能形成若干条链,并且这k个点的每一个最多与 ...

  8. 完全免费,再也不用担心转pdf文件乱来乱去的问题了

    完全免费,再也不用担心转pdf文件乱来乱去的问题了. 源代码:https://github.com/xlgwr/WpsToPdf.git 第三方插件Bye Bye... 功能说明 主要引用Wps金山办 ...

  9. 预处理、const、static与sizeof-C++中const有什么作用(至少说出3个)

    1:作用如下: (1)const用于定义常量:const定义的常量编译器可以对其进行数据静态类型安全检查. (2)const修饰函数形式的参数:当输入参数为用户自定义类型和抽象数据类型时,应该将“值传 ...

  10. redis事务机制和分布式锁

    Redis事务机制 严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的:Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行.  ...