热门看点:Lua是什么?javaLua应用场景游戏开发
目录
(资料图片仅供参考)
Lua是什么Lua应用场景Lua和C#的区别print方法、单行/多行注释Lua命名规则(标识符)全局变量的使用和销毁Lua中的数据类型nil 空类型boolean 布尔类型number数字类型string字符串类型table表类型function函数thread和userdata类型 全局变量和局部变量的声明和使用循环while循环for循环repeat until循环循环嵌套 流程控制function用法特性总结运算符字符串操作数组迭代器表模块元表(Metatable)__index 元方法__newindex 元方法为表添加操作符__call元方法__tostring 元方法 协同程序(coroutine)Lua中文件的IO垃圾回收实现面向对象
Lua是什么
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 可以很方便的和其他程序进行集成(c++,c#,java等)
Lua应用场景
游戏开发 独立应用脚本 Web 应用脚本 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench 安全系统,如入侵检测系统
Lua和C#的区别
Lua 可以在几乎所有的操作系统和平台进行编译运行,可以很方便的更新代码,更新了代码后,可以直接在手机上运行,不需要重新安装(比如热更新方案)
C#只能在特定的操作系统中进行编译成dll文件,然后打包进安装包在其他平台(比如 Android、iOS),如若已经运行在移动平台上,不能更新替换已有的dll文件,除非重新下载安装包
print方法、单行/多行注释
print("Hello world")-- 用来表示单行注释--[[用来表示多行注释--]]
Lua命名规则(标识符)
1,不能以数字开头 2,不能是关键字 关键字比如: and//break//do//else//elseif//end//false//for//function等
而且在 Lua 中大小写是敏感的,and 是关键字,And,AND 这是两个不同的标识符
还有_XXX(_ABC)这种不推荐使用(是保留用法,在 Lua 中有特殊的用法)
全局变量的使用和销毁
Lua中变量不需要声明,可以直接使用,也不需要初始化,可以直接使用。 对于没有初始化和声明的变量默认值为 nil(空类型,空值)
b = nil
把一个变量置空(nil),相当于没有使用过这个变量,Lua 会销毁 b 所占的内存
Lua中的数据类型
nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 boolean包含两个值:false和true。 number表示双精度类型的实浮点数 string字符串由一对双引号或单引号来表示 function由 C 或 Lua 编写的函数 userdata表示任意存储在变量中的C数据结构 thread表示执行的独立线路,用于执行协同程序 tableLua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
在 Lua 中有一个 type 方法,它可以返回数据的类型,输出的是 string 字符串,比如:
print(type("Hello world")) --> stringprint(type(10.4*3)) --> numberprint(type(print)) --> functionprint(type(type)) --> functionprint(type(true)) --> booleanprint(type(nil)) --> nilprint(type(type(X))) --> string
nil 空类型
没有声明和赋值的变量都是默认 nil 类型 这个 nil 类型下面只有一个值 nil 值 把一个变量赋值为 nil,表示回收并删除这个变量
boolean 布尔类型
这个下面只有两个值 true 和 false false 和 nil 都代表 false,其他任何值都代表 true(0和空字符串 Lua 也都认为是 true)
number数字类型
1,数字的表示方式 4 0.4 4.45e-3 0.3e12 5E+20 2,整数和小数都是 number 类型的 type(3) type(3.5) 3,如果整数和小数的大小是一样的,那么 Lua 认为就是相等的 1 == 1.0 -3 == -3.0 0.2e3==200 4,如果我们想要区分整数和小数这两种类型,可以使用 math.type 函数 math.type(3) math.type(3.0) integer float 5,1e3 表示一个小数 1000.0 6,支持16进制 0xff 0x1A3 0x0.2
string字符串类型
定义:使用单引号或者双引号表示字符串
1,替换字符串
a="one string"; b=string.gsub(a,"one","another") print(a) --> one string print(b) --> another string
2,取得字符串的长度#
print(#a) --> 10 print(#"good bye") --> 8
3,字符串组拼
"Hello".."World" "result is"..3
table表类型
表在 Lua 中是一个非常重要的数据结构,也是最有权力的。 1、我们可以使用表表示数组,集合,字典… 2、Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。 3、Lua table 是不固定大小的,你可以根据自己需要进行扩容。 4、表既不是值类型也不是变量,它是对象。 5、Lua 也是通过 table 来解决模块(module)、包(package)和对象(Object)的。 例如 string.format 这里其实 string 并不是一个类。在 Lua 中没有类,Lua 中使用 table 实现类、面向对象这些概念。
tab1 = {} --空表 {}构造表达式 tab2 = {key1=100,key2="value2"} --初始化一个表 tab2[1] = "Lua" -- 指定值 print(tab1) print(tab1.key) print(tab2.key1) print(tab2["key1"]) tab2 = nil -- 移除引用 Lua 的垃圾回收会释放内存 tab3 = {"apple","pear","orange","grape"} print(tab3[2]) print(tab3["2"]) for key,val in pairs(tab3) do print(key..":"..val) end for key,val in pairs(tab2) do print(key..":"..val) end
关于表的自动垃圾回收:当我们创建一个表 a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向 a,Lua的垃圾回收机制会清理相对应的内存。
function函数
比如一个求阶乘的函数
function fact(n)if n==1 thenreturn n;elsereturn n*fact(n-1);endendprint(fact(3))print(fact(5))fact2 = factprint(fact2(5))
另一种,关于function函数,作为参数传递和匿名函数的用法
function testFun(tab,fun) for k ,v in pairs(tab) do print(fun(k,v)); endendtab={key1="val1",key2="val2"};testFun(tab,function(key,val)--匿名函数 return key.."="..val;end);执行结果为:key1 = val1key2 = val2
thread和userdata类型
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。 线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
全局变量和局部变量的声明和使用
全局变量
a = 5 print(type(a)) --> number--类型可变a = "Hello"print(type(a)) --> string
局部变量
--局部变量的销毁是在所在语句块结束local b = 10print(b)function test()c = 5local d = 6endtest()print(c,d)dolocal a = 10b =11print(a,b)endprint(a,b)
多变量赋值
a,b = 10,20 -- a = 10 b = 20a,b,c = 10,20,"Hello"print(a,b,c)a,b = b,a -- a = b b = a 也就是 变量交换值print(a,b)a,b = 10,20,30 --多的值自动略去print(a,b)a,b,c = 20,30 --没有值赋值 nilprint(a,b,c)function test()return 40,50enda,b = test() --返回多个值 并获取print(a,b)
循环
1,while循环 2,for循环 3,repeat unitl (do while)
while循环
while (condition) dostatementsenda = 1while (a<=20) doif (a%2==1) thenprint(a)enda=a+1end
for循环
1,数值for循环
for var=start,end,step do 循环体 end 这里var会从start变化到end,每次变化一step进行
for i=1,10,2 doprint(i)endfor i=20,1,-3 doprint(i)end
2,泛型for循环
tab1 = {key1="value1",key2="value2"}for k,v in pairs(tab1) doprint(k,v)endtab2 = {"apple","橡胶","西瓜","猕猴桃"}for k,v in pairs(tab2) doprint(k,v)end
repeat until循环
repeat 循环体 until(condition)
a = 1repeatprint(a)a=a+1until(a>10)
循环嵌套
for i=1,10 dofor j=1,i doprint(i)endendfor i=1,10 doj=1while j<=i doprint(i)j=j+1endend
流程控制
if (布尔表达式) then 为true的时候要执行的代码 end
if(布尔表达式)then 为true的时候要执行的代码 else 为false的时候要执行的代码 end
if (布尔表达式) then //1 elseif (布尔表达式) then //2 else //3 end
-----if (0) thenprint(0)end-----a = 10if (a>10) thenprint("a大于10")end-----if a<=10 thenprint("a小于等于10")end-----if (b) thenprint("b不为空")elseprint("b为空")end-----a = 100if (a<=50) thenprint("a<=50")elseif (a<=100) thenprint("a<=100")elseif (a<=150) thenprint("a<=150")elseprint("上面三种情况都不满足")end
function用法特性总结
[local] function functionName(arg1,arg2,arg3…argn) functionBody [return value1,value2…valuen] end
local function max(num1,num2)if(num1>num2)thenreturn num1elsereturn num2endendprint( max(1,10) )--函数可以作为数据赋值 可以作为参数传递temp = maxprint(temp(40,3))-----myprint = function (param)print("这个是我的打印函数"..param)endmyprint(100)-----function add(num1,num2,printFun)local res = num1+num2printFun(res)endadd(40,50,myprint)--lua里面的函数可以返回多个值
可变参数 用 ...三个点表示
function average(...)local arg = {...}res = 0for k,v in pairs(arg) dores = res+vend-- #arg 取得参数的个数 #"hello"print(res/#arg)endaverage(10)average(1,30)average(3,8,90)average(5,67,7,8,3)
运算符
算术运算符:+ - * / % ^求幂 -
关系运算符: == ~= > < >= <=
if(a==b)thenprint("a==b")elseprint("a~=b")end-----if(a~=b)thenprint("ab不相等")elseprint("ab相等")end-----if(a<B)THENPRINT("A小于B")ELSEPRINT("A不小于B")END< code="">
逻辑运算符 and or not a and b a ,b 都为true则结果为true a or b a,b中只要有一个为true,结果为true not a 非/取反
print( 30>20 and 10>30)print( false or false )print (not true)
字符串操作
str ="My name is MoGu! name"str2 =string.upper(str)str3 =string.lower(str)str4 =string.gsub(str,"i","123",5)index = string.find(str,"name",5) --返回所查找到的位置的索引str5=string.reverse(str)num1 = 5num2 = 10print(str,str2,str3,str4,index)print(str5)print("加法运算:"..num1.."+"..num2.."="..(num1+num2))username = "w3er4wwrfwer"password = "lkjlw3e4rl"print("select * from user where username = ""..username.."" and password =""..password..""")str6=string.format("加法运算:%d+%d=%d",num1,num2,(num1+num2))print(str6)str7 = string.format("select * from user where username="%s" and password ="%s"",username,password)print(str7)date = 2; month = 1; year = 2014print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))s1 = string.char(97,98,99,100)i1 =string.byte("ABCD",4)i2 =string.byte("ABCD")print(s1,i1,i2)length1 = string.len("abc")length2 = #"abc"print(length1,length2)s2=string.rep("abcd",4)print(s2)for word in string.gmatch("Hello Lua user", "%a+") doprint(word)end
数组
Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。
array = {"Lua","C#"}array[3]="Java"for i=1,3 doprint(array[i])endarray = {}for i =-2,2 doarray[i]=i*3endfor i=-2,2 doprint(array[i])end
二维…多维数组
array = { {"小明","小红"},{"小刘","小狼"},{"大明","大刘"},{"小赵","李四"} } --4*2print(array[3][1])for i =1,4 dofor j=1,2 doprint(array[i][j])endendarray = {{},{},{}}for i = 1,3 doarray[i]={}for j=1,2 doarray[i][j]=i*jendendfor i = 1,3 dofor j=1,2 doprint(array[i][j])endend
迭代器
pairs迭代table,遍历表中所有的key跟value ipars按照索引从1开始,递增遍历,遇到nil值就停止
array = {"Lua","C#","Java"}for k in pairs(array) doprint(k,v)endarray[2]=nilfor k,v in ipairs(array) doprint(k,v)end
整体的结构
for 变量列表 in 迭代函数,状态变量,控制变量 do--循环体end
1,调用迭代函数,(把状态变量和控制变量当做参数传递给迭代函数) 状态变量只会在第一次调用的时候赋值。 2,如果迭代函数的返回值为nil,退出for循环;如果不是nil的话,把返回值赋值给变量列表,并执行循环体。
自定义迭代函数,求平方
function square(state,control)if(control>=state) thenreturn nilelsecontrol=control+1return control,control*controlendendfor i,j in square,9,0 doprint(i,j)end
表
表的基本
mytable = {}mytable[1] = "Lua"mytable[1] = nilmytable = nilmytable = {}print( type(mytable) )mytable[1] = "Lua"mytable["name"]="siki"newtable = mytableprint(newtable[1])print(mytable[1])newtable[1]="C#"print(newtable[1])print(mytable[1])newtable[2]="Java"print(mytable[2])mytable = nilprint(mytable.name)print(newtable.name)newtable = nil
表的基本操作
--方法一般都是 table.xxxxmethod--Table连接mytable = {"Lua","C#","Java","C++","C","abc","ABC"}print( table.concat(mytable) )print( table.concat(mytable,",") )print( table.concat(mytable,",",2,4) )--Table插入 mytable[6]="PHP"mytable[#mytable+1]="PHP"print(mytable[#mytable])table.insert( mytable,"Javascript" )print(mytable[#mytable])table.insert(mytable,2,"Boo")print(mytable[2],mytable[3])--Table移除mytable[2]=nilprint(mytable[2])table.remove(mytable,2)print(mytable[2])--Table排序mytable={34,32,34,2,45,45,435,6,4576,76,33,23,24,2343,21,2,2,2,2,2,2,2,2}print("排序前")for k,v in ipairs(mytable) doprint(k,v)endtable.sort(mytable)print("排序后")for k,v in ipairs(mytable) doprint(k,v)end--自定义最大值方法function get_max_number(tab)local mn = 0for k,v in pairs(tab) doif(mn<V) code="" thenmn="vendendreturn" mnendprint(="" get_max_number(mytable)="" )
模块
Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 。
module = {}module.var = "Name"module.func1 = function ()print("这个是Module里面的函数")endfunction module.func1()print("这个是Module里面的函数")endlocal function func2()print("这个是局部函数fun2") --相当于一个私有函数 privateendfunction module.func3()func2()print("这个是全局函数func3")endreturn module
那么如何使用它呢:
--require "模块名"--require ("模块名")m = require "module"print(m.var)m.func1()m.func3()
元表(Metatable)
元表提供了让我们改变 table 的行为的能力,每个行为关联了对应的元方法,可理解为对表操作的扩展。
mytable = {"Lua","Java","C#","C++"} --普通表mymetatable = {} --元表 元表扩展了普通表的行为mytable =setmetatable(mytable,mymetatable)print( mytable[3] )print(getmetatable(mytable))print(mymetatable)tab = setmetatable({"Lua","Java","C#","C++"} , {__metatable="lock"} )print(getmetatable(tab))-- 使用__metatable可以保护元表,禁止用户访问元表中的成员或者修改元表。
__index 元方法
Lua 在查找一个表元素时的规则,是如下3个步骤: 1.在表中查找,如果找到,返回该元素,找不到则继续。 2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。 3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。
mytable = {"Lua","Java","C#","C++"}--__index 当访问到一个表里不存在的索引的时候 起作用mymetatable = {__index = function (tab,key)if(key>=10) thenreturn "Javascript"endend }mytable =setmetatable(mytable,mymetatable)print(mytable)print(mytable[1])print(mytable[9])
mytable = {"Lua","Java","C#","C++"}newtable = {seven="Javascript"}newtable[9]="C"mymetatable = {__index = newtable }mytable =setmetatable(mytable,mymetatable)print(mytable)print(mytable[1])print(mytable.seven)print(mytable[9])
__newindex 元方法
这个方法用来对表更新。当表设置了元方法 __newindex,在对新索引键赋值时,会调用元方法,而不进行赋值。而如果是对已存在的索引键,则会进行赋值,不调用元方法 __newindex。
mytable = {"Lua","Java","C#","C++"}mymetatable = {__newindex = function(tab,key,value)print("我们要修改的key为:"..key.." 把这个key值修改为:"..value)rawset(tab,key,value)end }mytable =setmetatable(mytable,mymetatable)mytable[1]="C#"mytable[5]="Lua"print(mytable[1])print(mytable[5])
mytable = {"Lua","Java","C#","C++"}newtable = {}mymetatable = {__newindex = newtable}mytable =setmetatable(mytable,mymetatable)mytable[1]="C#"mytable[5]="Lua"print(mytable[1])print(mytable[5])print(newtable[5])
为表添加操作符
相加操作,__add 操作符
mytable = {"Lua","Java","C#","C++"} --普通表mymetatable = {__add = function(tab,newtab)local mi = 0for k,v in pairs(tab)doif(k>mi) thenmi = kendendfor k,v in pairs(newtab) domi=mi+1table.insert(tab,mi,v)endreturn tabend} --元表 元表扩展了普通表的行为mytable =setmetatable(mytable,mymetatable)newtable = {"PHP","Python"}v=mytable+newtablev2=newtable + mytablefor k,v in pairs(v2) doprint(k,v)end
__call元方法
在表调用一个值时调用
mytable = {"Lua","Java","C#","C++","ccdd"} mymetatable = {__call = function (tab,arg1,arg2,arg3)print(arg1,arg2,arg3)return "MoGu"end,}mytable =setmetatable(mytable,mymetatable)v = mytable(123,34,453)print(v)
__tostring 元方法
用于修改表的输出行为,可以自定义表的输出内容 示例一:
mytable = {"Lua","Java","C#","C++","ccdd"} --普通表mymetatable = {__tostring = function (mytable)local str = ""for k,v in pairs(mytable) dostr = str..v..","endreturn strend}mytable =setmetatable(mytable,mymetatable)print(mytable)
示例二:
mytable = {10, 20, 30} mymetatable = {__tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " .. sum end}mytable =setmetatable(mytable,mymetatable)print(mytable)
协同程序(coroutine)
--定义协同函数coroutine.create--启动协同函数coroutine.resume--暂停协同函数coroutine.yield--继续运行 coroutine.resume (不需要传递参数)co=coroutine.create(function (a,b)print(a+b)print(coroutine.status(co))print(a+b)print(coroutine.status(co))print( coroutine.running() )coroutine.yield(a*b,a/b)print(a-b)return a%b,a/b+1end)print( coroutine.running() )print(coroutine.status(co))res1,res2,res3 = coroutine.resume(co,10,40)print(res1,res2,res3)print(coroutine.status(co))print("I"m here!")res1,res2,res3 = coroutine.resume(co)print(res1,res2,res3)print(coroutine.status(co))--第一个yield的参数作为第一个resume的返回值--第一个resume的参数作为协程的参数, 第二个resume的参数作为第一个yield的返回值
function foo (a) print("foo 函数输出", a) return coroutine.yield(2 * a) -- 返回 2*a 的值end co = coroutine.create(function (a , b) print("第一次协同程序执行输出", a, b) -- co-body 1 10 local r = foo(a + 1) print("第二次协同程序执行输出", r) local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入 print("第三次协同程序执行输出", r, s) return b, "结束协同程序" -- b的值为第二次调用协同程序时传入end) print("main", coroutine.resume(co, 1, 10)) -- true, 4print("--分割线----")print("main", coroutine.resume(co, "r")) -- true 11 -9print("---分割线---")print("main", coroutine.resume(co, "x", "y")) -- true 10 endprint("---分割线---")print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutineprint("---分割线---")
Lua中文件的IO
简单模式:拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。 完全模式:使用外部的文件句柄来实现。它以一种面向对象的形式,将所有的文件操作定义为文件句柄的方法。
打开文件操作语句如下: file = io.open (filename ,[ mode])
模式诸如以下这些: r,以只读方式打开文件,该文件必须存在。 w,打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 a,以附加的方式打开只写文件。若文件不存在,建立该文件,如果存在,写入的数据会被加到文件尾,即原先的内容会保留。 r+,以可读写方式打开文件,该文件必须存在。 w+,打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a+,与a类似,但此文件可读可写 b,二进制模式,如果文件是二进制文件,可以加上b +,号表示对文件既可以读也可以写
简单模式
-- 以只读方式打开文件file = io.open("data.lua", "r")-- 设置默认输入文件为 data.luaio.input(file)-- 输出文件第一行print(io.read())-- 关闭打开的文件io.close(file)-- 以附加的方式打开只写文件file = io.open("data.lua", "a")-- 设置默认输出文件为 data.luaio.output(file)-- 在文件最后一行添加 Lua 注释io.write("-- data.lua 文件末尾注释")-- 关闭打开的文件io.close(file)
file = io.open("data1.txt","w")io.output(file)io.write("www.runoob.com1\n")io.write("www.runoob.com2")io.write("www.runoob.com3")io.write("www.runoob.com4")io.close(file)file = io.open("data1.txt","r")io.input(file)print(io.read(10)) --读取一行\print(io.read(10)) --读取一行\print(io.read(10)) --读取一行\print(io.read(10)) --读取一行\print(io.read(10)) --读取一行\io.close(file)
完全模式
file=io.open("data1.txt","r")print(file:read())print(file:read())file:close()file=io.open("data1.txt","a")file:write("www.runoob.com5")file:close()
垃圾回收
Lua 提供以下函数collectgarbage ([opt [, arg]])用来控制自动内存管理:
collectgarbage(“collect”), 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能: collectgarbage(“count”),以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。 collectgarbage(“restart”),重启垃圾收集器的自动运行。 collectgarbage(“setpause”),将 arg 设为收集器的 间歇率 (参见 §2.5)。 返回 间歇率 的前一个值。 collectgarbage(“setstepmul”),返回 步进倍率 的前一个值。 collectgarbage(“step”),单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。 collectgarbage(“stop”),停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。
mytable = {"apple", "orange", "banana"}print(collectgarbage("count"))mytable = nilprint(collectgarbage("count"))print(collectgarbage("collect"))print(collectgarbage("count"))
实现面向对象
--对于一个对象来说 属性 方法person ={name="MoGu",age=99 }person.eat = function ()print(person.name.."在吃饭")endfunction person.eat()print(person.name.."在吃饭")endperson.eat()
通过 “·” 来调用方法的时候,self 不会自动赋值,我们必须通过第一个参数来传递当前的 table。
person ={name="MoGu",age=99 }person.eat = function (self)print(self.name.."在吃饭")endperson.eat(person)a = persona.eat(a)
通过 " : " 调用的时候,系统会自动传递当前的 table 给 self。
person ={name="MoGu",age=99 }function person:eat()print(self.name.."在吃饭")endperson:eat()a = persona:eat()
new 新对象
Person ={name="MoGu",age=99 }function Person:eat()print(self.name.."在吃饭")print(self.name.."的年龄是"..self.age)endfunction Person:new(o)local t = o or {}--调用一个属性的时候,如果 t 中不存在,那么会在 __index 所指定的 table 中查找 setmetatable( t, {__index=self })setmetatable(t,self)self.__index=selfreturn tendStudent = Person:new()Student.grade=1stu1 = Student:new()stu1:eat()print(stu1.grade)
标签:
相关推荐:
精彩放送:
- []鼠标属性中没有触摸板的驱动卡怎么办?详情介绍
- []电脑xp系统怎么升级到win7方法?傻瓜教程来了|世界信息
- []什么叫无线网络?无线网卡与有线网络有什么区别?
- []HTML中空格怎么打出来?html页面中表示空格的字符实体有哪些?
- []华硕x450vb黑苹果系统怎么安装?安装步骤
- []如何建立倒数计时器?javascript建立倒数计时器|每日简讯
- []环球讯息:路由器连接路由器怎么设置?路由器连接的设置方法
- []40个技巧优化您的PHP代码 php中的字符替换比正则替换
- []【天天热闻】宜宾VS常州,谁才是“动力电池之都”?
- []DE命令的使用作用:观看和修改寄存器的值
- []全球看点:知识剖析|表单元素有哪些?各有什么属性?
- []如何制作一套简单的模板流程?Discuz模板制作教程
- []今日视点:12.8GW!华电内蒙古腾格里沙漠新能源大基地获批
- []国泰君安证券:一季度经济超预期的三层含义|焦点热闻
- []宁德时代与比亚迪巅峰对决
- []当下电化学储能产业发展的喜与忧
- []汽车车损险包括涉水险吗?如何查看车买的保险?
- []环球资讯:旧爱难舍 明星基金经理逆势加仓新能源
- []leisure是什么意思?leisure的用法有哪些? 每日速看
- []全球快讯:csol角色技能怎么用?csol角斗场详情介绍
- []中国长城:4月21日融资买入1.78亿元,融资融券余额17.57亿元
- []什么是超级链接?怎么做? 最资讯
- []【世界新要闻】高德地图离线包在哪里下载?离线地图下载指南
- []电池护照追踪:跨越国界的数字通行证如何落地?
- []dota2头像不显示是怎么回事?dota2头像网页打不开怎么办?_今日热门
- []焦点精选!克勤于邦克俭于家是什么意思?克勤于邦克俭于家详情介绍
- []什么是USB-HDD模式?U启动U盘启动模式介绍_每日速读
- []win10本地账户怎么改名字?win10本地账户修改名字方法_全球速看
- []冰箱压缩机维修的方法有哪些?冰箱压缩机维修方法介绍
- []甲骨文是什么朝代出现的?甲骨文详情介绍-天天头条
- []锻的意思是什么?锻的意思有哪些?
- []平整的近义词是什么?平的意思有哪些?
- []今日热搜:nano是什么意思?vim和nano有什么区别?
- []年报观察 | 格力地产困境重组
- []天天速读:红桃k果泡酒怎么做?红桃k果泡酒的方法与功效
- []新资讯:家庭电烤箱怎么烤鱼?家庭电烤箱烤鱼做法【教程详解】
- []ctt干衣机是哪个牌子?ctt干衣机好不好用? 每日焦点
- []世界上最聪明的动物是什么?动物之最排行榜
- []【环球报资讯】edg厂长777是什么梗?厂长从明凯的黑点变成了正常的外号
- []电脑病毒有什么危害?电脑中毒后应该如何解决?_世界今日讯
- []【天天快播报】佳能小痰盂是什么?佳能EF50mmf/1.8镜头是什么?
- []熔断机制什么意思?什么是股市熔断机制? 焦点信息
- []魔兽世界:服务器维护一般几点结束?在哪里看魔兽世界维护时间?-天天快消息
- []淘宝客APP如何配置?淘宝客系统配置文档免费获取
- []电脑投屏到电视的方法有哪些?讲解电脑投屏具体方法步骤 世界热讯
- []如何在DOS命令窗口输入mysql数据库?DOS命令窗口输入mysql数据库的方法
- []每日聚焦:期票与支票的差别分别是什么?期票与支票的区别
- []goal是什么意思?goal的用法有哪些?
- []commonfiles是什么文件夹?speechengines的中文意思解释 世界热讯
- []硬盘驱动器和SSD有什么区别?为什么要用SSD驱动器? 当前视讯
- []二阶魔方的高级工式一、常用变换及注意事项-环球看热讯
- []全球快消息!佳能7D相机怎么选择测光模式?测光模式的差别
- []当前速读:刮淋巴的好处是什么?刮痧的九大禁忌症状
- []word怎么使用制表位?word制表位的使用方法
- []如何通过电脑向ipad传电影视频?教你在ipad上看电脑上的电影
- []酷派8295手机怎么样?有什么优势?
- []前沿热点:8部门部署15项重点任务 推进IPv6技术演进和应用创新发展
- []速读:screw是什么意思?screw的用法有哪些?
- []硬盘底座是什么?移动硬盘盒和磁盘阵列柜有什么区别?-环球最新
- []ATI5650驱动怎么安装?ATI5650驱动安装方法
- []【独家焦点】执手锁怎么安装?执手锁安装步骤
- []绘图显卡是什么?笔记本上常见的移动图形处理器_世界观点
- []开关怎么接线?开关接线方法大全
- []部落守卫战游戏怎么玩?部落守卫战游戏攻略 世界简讯
- []环球即时:win7电脑如何提升开机速度?提升开机速度的方法
- []世界快讯:【技术】变频器与步进/伺服驱动技术完全精通教程
- []解局 | 远洋20亿债务兑付里的信心战
- []世界热资讯!西门子开关怎么样?西门子开关特点介绍
- []GC算法标记-清除复制标记 整理分代收集一些收集器
- []美团会员红包在哪看?美团会员红包查看方法 当前头条
- []今热点:骁龙712处理器怎样?骁龙710处理器参数汇总
- []天天热推荐:怎么查看手机的ip地址?关于手机ip地址的设置
- []华为m7怎么样?华为m7手机价格是多少?-世界观天下
- []万科、保利等之后 越秀介入广州葵蓬村巨无霸旧改
- []二手房参考价调整传闻扰动深圳楼市迅速反应_天天即时看
- []全球时讯:鲁能竞标成功 底价132.9亿拿下上海黄浦两宗地块
- []全球今亮点!自己怎么装电脑?装机diy教程
- []View绘制流程2-安卓如何执行measure/draw 全球最新
- []天天资讯:如何让网站支持QQ登陆?discuz开放QQ注册的方法
- []系统更新就服华为!EMUI10.1已全网推送你更新了吗?
- []DVWA之暴力破解之high级别low和medium级别
- []javac配置成功了吗?Java JDK path环境变量配置-环球百事通
- []不同生物眼中的世界是怎样的?动物视觉感知进化的一些看法-环球动态
- []联想366t手机如何刷回官方原版的固件rom?联想A366t线刷刷机教程-每日讯息
- []每日视点!陈小兰:传承中医药炮制技艺
- []java中的心跳包是如何发送的?心跳检测实现2.1-速读
- []“报复性出差”来了,2023年中国差旅复苏势头领跑全球,支出增长率预计达20%
- []产煤不见煤 智能化煤矿建设渐入佳境
- []恒瑞医药的2022,比想象中的更严峻-天天最新
- []【天天快播报】清朝皇帝陵墓在哪_清朝皇帝陵墓介绍
- []当前时讯:掌中宝是什么资料_掌中宝是什么
- []天天新资讯:行政区划体制改革_行政区划体制
- []世界即时:郑州暴雨保险赔吗
- []互惠保险什么意思
- []恒辉安防:请您参考公司于2023年4月21日年报披露的股东人数信息
- []货车买保险去哪家
- []公积金比例怎么算
- []联动云有保险吗? 全球热头条
- []总决赛再演!浙江东阳光击败广东男篮,与辽宁队会师半决赛
- []日本文字翻译器 日本文字翻译_报道
- 高收益的城市便捷酒店4.0,俘获到年轻人的欢心
- 每日简讯:如何使用mathtype7编辑数学公式?mathtype7公式编辑教程
- 热门看点:Lua是什么?javaLua应用场景游戏开发
- 更换固态硬盘电脑的速度就会起飞吗?e450c换固态硬盘教程
- 全球微动态丨wifi direct是什么意思?无线网络中的wifidirect是什么?
- 为什么要做QQ群排名?如何通过QQ引流?
- ups电源的AH单位是怎么意思?电池容量和耗电量计算|全球新动态
- 焦点!14英寸电脑长宽多?14英寸电脑具体尺寸是多少厘米?
- 世界即时:什么是mdb文件格式?mdb文件怎么打开?
- 配线架的用途有哪些?网络综合布线中配线架的选型和安装方法 世界简讯
- 天天快资讯:季半夏傅斯年免费阅读
- exands secure wifi_exands 天天看热讯
- 今天要上班 这都可以?|速读
- 全球快讯:验孕棒晚上测准吗月经不调_验孕棒晚上测准吗
- 焦点快播:网传3人在四川什邡天鹅林场服毒自杀,警方:确实发现3具尸体
- 香港明年起将4月23日定为“香港全民阅读日”
- 莱曼谈拜仁战绩不佳:球员无需负主要责任,因为他们就在执行战术 今头条
- 100名地铁志愿者圆满完成“青马”服务保障|每日精选
- 中建、湖北文旅建发联合拿下北京共有产权房项目用地 世界最资讯
- 环球即时:奥克斯空调说明书在哪_奥克斯空调说明书
- 证监会核发首批企业债券注册批文 涉34个企业募集资金542亿
- 世界快看:全国同业最多!成都住房公积金实现5类核心业务场景数字人民币应用全覆盖
- 同比增长8.4%!湖南建筑业一季度实现较快增长|环球新视野
- 润禾材料:公司是原材料供应商,终端产品生产客户会根据自身需求,采购或定制其相关原材料
- 全球看热讯:辽宁省:加强海外知识产权保护合作 为“走出去”企业保驾护航
- 广东第一季度地区生产总值30178.23亿 同比增长4.0%
- 世界观点:打击仿冒“得物包装”案入选上海知识产权保护十大典型案例
- 中上协房地产行业委员会成立大会在杭州召开
- 住进“ICU”的神龙汽车 全面电动化转型能否“自救”成功_热消息
- 世界看热讯:深特发拟发行4.7亿元超短期融资券 期限90天
- 焦点热讯:读书之美丨重温文学经典 影视主创把《平凡的世界》读给你听
- 晶科能源2023年第一季度预计净利16亿-17亿同比增长299%-324% 全球市场需求旺盛_当前观察
- 2008年以来最高!美国主权CDS飙升,市场预期违约在即? 热消息
- 【天天报资讯】北京昌平科技园2022年度第二期6亿中期票据将于5月5日付息
- 中国上城发现4个主要内部控制问题 称已采取充分补救措施
- 天天微速讯:中辰股份:截至2023年4月20日,公司持股户数为21328户
- 国际实业:截至2023年4月20日,公司的股东总户数为39,474户
- 山西玖和恒创机电设备有限公司-快消息
- 下周(4.24-4.30)全球市场大事提醒_速看
- 中创新航江门项目产品正式下线!6月将发布新型储能电池
- 【报资讯】唐山哪家做包皮手术好?【唐山唐诚医院专业做包皮手术医院】
- 信达地产:公司2022年末对外提供担保60.61亿元 降幅为4.95%-精选
- 天天热门:安道麦A:公司在巴西的销售业务主要以巴西雷亚尔进行结算
- 每日热议!中际旭创:具体要看客户的网络架构,200G/800G光模块可以与之配套
- 广东宏大: 截止至2023年4月20日,公司在册股东总户数为30,460户
- 热点追踪 | 用发展空间看公司未来|当前观点
- 环球新消息丨青岛市市南区强招引促落地 打好招商引资“组合拳”
- 苏能股份:子公司拟投15亿元建徐州泉山经开区全域光伏项目 全球热闻
- 最新快讯!糟糕的家庭,总是喜欢在小事上消耗孩子,慢慢毁掉孩子还不自知
- 林洋能源与国家电投集团湖北电力有限公司、新源智储能源发展(北京)有限公司签订战略合作协议
- N型电池片技术百花齐放 TOPCon产能率先放量
- 世界快消息!低碳装机达26.07%!华电国际发布2022年ESG报告
- 要闻:浙江缙云抽蓄电站500千伏出线洞斜井段贯通
- 新型电力市场机制探索与发展趋势
- 分布式光伏“南迁”_环球新资讯
- 全球关注:湖南宁乡2022年储能材料产值约440亿 已集聚40多家锂电企业
- 世界简讯:中国电力沂水独立储能电站项目成功并网
- 新湖中宝注册发行20亿元中期票据 用于改善公司债务融资结构-世界头条
- 联创股份:截止3月底公司股东总数104,516户
- 甘化科工股东户数下降1.11%,户均持股17.37万元|天天微资讯
- 北京住总12.2亿元ABN将付息 A类利率4.80%、B类利率5% 环球关注
- 侨源股份:截至2023年4月20日公司的股东总数是5635|天天通讯
- 青岛西海岸一宗商住用地将于下月法拍 起拍价1.61亿元
- 当前头条:绿城38.58亿元摘得西安高新区2宗居住地 为陈林村城改项目用地
- 淮南建发集团30亿元私募债券项目更新至“已反馈”
- 高铁检修保安全 快看
- 精测电子:截至2023年4月10日,公司股东总户数16,226户 全球微资讯
- 今日热门!欧洲储能系统商业模式的演变
- 动力电池+储能_天天最资讯
- 1.03~1.6元/Wh!11企业入围中核1.2GW/3.2GWh储能系统集采
- 携程商旅国际打车服务上线;美团民宿发票服务升级 | 一周商旅动态 每日精选
- 夏邑县汽车站时刻表_夏邑县火车站
- 大众子公司 PowerCo 正在加拿大建设 90 GWh 电池工厂
- 今头条!3月储能全动态!超100GWh项目完成签约
- 公募基金一季度调仓思路全曝光:狂买三六零、海康威视等AI概念股_全球快资讯
- 世界要闻:探索古籍奥秘 品读家国情怀 新区举办古籍科普展弘扬传统文化
- 郑州公共住宅建设3.8亿元中票注册文件需增加信息披露 全球速看
- 特发服务:2022年实现收入20.05亿元-今日热讯
- 顺网科技:公司在AI领域较强的技术储备,可为AIGC等人工智能应用提供算力、算法、云渲染等技术服务
- 合肥滨湖建投4.5亿元中期票据将付息 利率3.5%-环球热议
- *ST日海:公司当前未与上述公司开展业务合作,主营业务中没有光模块、CPO业务-全球动态
- 焦点要闻:西安曲江新区推出1宗住宅用地 净用地面积4万平方米
- 远兴能源:截止2023年4月20日,公司股东人数为100,488户
- 环球新动态:合肥:肥东撮镇镇大郭1片区拟征地 面积超1700亩
- 鸿博股份:公司各项业务均正常开展,公司会根据市场的需求以及自身的实际情况进行合理的业务规划-全球热闻
- 全球快看:孕前保健
- 中国电建2023年一季度新签5亿元以上项目55个!含9个储能项目_精选
- 环球微资讯!光伏储能继续火爆,何种储能路线最香?
- 储能市场爆发已成共识,但项目如何盈利仍是痛点 天天报道
- 【世界时快讯】立志是什么意思?立志的相关名言有哪些?
- “梭哈魔咒”来了?知名游资杀疯了 历史上仅出现4次!TMT板块大调整 机构怎么看 动态
- 金碧辉煌是什么意思?金碧辉煌出自哪里? 独家
- 惊喜英文怎么说?惊喜英文例句有哪些?
- 储能招标丨7.5MW/20.127MWh!江苏苏州储能电站项目EPC招标_当前看点
- 【环球播资讯】冕宁县景点有哪些?冕宁县景点介绍?
- 天天热点!去台湾怎样办理通行证?去台湾办理通行证过程是怎样的?
- 发电方式有哪些?常见的发电形式介绍?
- 【全球新视野】长沙超300米金茂梅溪大厦塔楼核心筒封顶 预计5月底验收交付
- 今日热闻!凸透镜成像实验怎么做?凸透镜成像的实验步骤有哪些?
- 要闻:沈葆桢的人物评价?沈葆桢资料介绍?
- 北京朝阳孙河前苇沟地块收到40亿元报价 用地规模6.15万平方米 微速讯
- 海螺姑娘什么梗?海螺姑娘是什么故事? 世界热闻
- 虾蛄怎么做好吃?虾蛄的做法介绍?
- 因未按时披露2021年年报 福建阳光集团收到上交所纪律处分决定书
- 南京新街口一办公楼1.2亿元二次流拍 为克莉丝汀执董朱永宁所有
- 美亚柏科:目前6G通信技术尚处于研究和探索阶段,暂无具体的6G标准 热文
- 世界快看点丨同和药业(300636.SZ):2022年度净利增24.10%至1.01亿元 拟10派0.45元
- 全球速看:金三江:拓展海外市场和拓展新领域是我司重点经营管理工作
- 全球观察:中国金茂成立上海兴秀茂商业管理公司 注册资本5000万元
- 世界看热讯:桃花姬阿胶糕的功效及食用方法 阿胶糕哪个牌子最好