首页 > 其他分享 >16.lua面向对象

16.lua面向对象

时间:2024-04-13 23:24:53浏览次数:11  
标签:function end str .. 面向对象 self 16 lua animal

Lua 中没有类的概念,但通过 table、function 与元表可以模拟和构造出具有类这样功能
的结构。
1.简单对象的创建
Lua 中通过 table 与 fcuntion 可以创建出一个简单的 Lua 对象:table 为 Lua 对象赋予属
性,通过 function 为 Lua 对象赋予行为,即方法。
现有如下两个对象

--创建一个animal对象
animal = {att = "动物", name = "无名", age = 1, des = "描述", bark = "汪汪"}

animal.setAtt = function(str)
	animal.att = str
end

animal.setName = function(str)
	animal.name = str
end

animal.setAge = function(age)
	animal.age = age
end

animal.setDes = function(des)
	animal.des = des
end

animal.setBark = function(strBark)
	animal.bark = strBark
end

animal.tostring = function()
	if (animal == nil) then
		print("animal为空了")
		return
	end
	str = animal.att.." "..animal.name.." "..animal.age.." "..animal.des.." "..animal.bark
	print(str)
end

animal.tostring()

animal.setName("二哈")

animal.tostring()

anima2 = animal	--相当于c++中的浅复制

当 animal = nil 置空后,anima2会出现无法继续访问animal对象中的方法。
如下:

animal = nil --执行这串代码后anima2相当于c中的野指针了(也不完全是,只是无法正确调用函数,其余值还是可以的)

anima2.tostring()
//输出结果:
动物 无名 1 描述 汪汪
动物 二哈 1 描述 汪汪
animal为空了

解决办法:用另外一种方式实现tostring(),如下:

function animal:tostring()
	if (self == nil) then
		print("self为空了")
		return
	end
	str = self.att.." "..self.name.." "..self.age.." "..self.des.." "..self.bark
	print(str)
end
--注意:此时访问也用 : 号 如:
 anima2:tostring()
//输出结果如下:
动物 无名 1 描述 汪汪
动物 二哈 1 描述 汪汪
动物 二哈 1 描述 汪汪

标签:function,end,str,..,面向对象,self,16,lua,animal
From: https://www.cnblogs.com/gom-linwei/p/18133548

相关文章

  • CF1165E Two Arrays and Sum of Functions 题解
    题目简述已知两个长度均为$n$的数组$a$和$b$。给定一个函数:$f(l,r)=\sum\limits_{l\lei\ler}a_i\cdotb_i$。你的任务是对数组$b$中的元素以任意的顺序重新排序,使$\sum\limits_{1\lel\ler\len}f(l,r)$的值最小。题目分析我们首先进行化简,发现题......
  • 25天【代码随想录算法训练营34期】第七章 回溯算法part02 ( ● 216.组合总和III ● 17
    **216.组合总和III**classSolution:defcombinationSum3(self,k:int,n:int)->List[List[int]]:result=[]self.backtracking(k,n,1,[],result,n)returnresultdefbacktracking(self,k,n,startingIndex,path,result,......
  • 14.lua模块(多文件)
    导入其他模块用:require("文件路径,注意去掉后缀");小括号本身可以省略,即:require"文件路径,注意去掉后缀名"如:现在有如下文件模块model.lua,代码如下:calArea={}calArea.pi=3.14--计算三角形面积functioncalArea.triangle(w,h) return0.5*w*hend--计算矩形......
  • 13.lua迭代器
    ipairs(table):仅会迭代指定table中的数组元素。pairs(table):会迭代整个table元素,无论是数组元素,还是key-value。基本形式:fori,vinipairs(table1)then代码块endfork,vinpairs(table1)then代码块end//示例:t1={"a",age=23,"b","c",name=&quo......
  • 16、数据库加固-mysql 加固
    1.修改DBA登录密码shell下执行:mysqladmin-urootpassword非首次修改:mysqladmin-urootpassword-p原密码在mysql下执行:updateusersetpassword=password('密码')whereuser='root';flushprivileges;2.删除默认数据库和用户删除测试库showdatabases......
  • 16、数据库加固-mongo 加固
    1.指定日志与数据库存放位置在配置文件中设置指向目录位置自建配置文件:vim/usr/local/mongodb/etc/mongodb.confdbpath=/data/dblogpath=/usr/local/mongodb/logs/mongdb.log2.更改默认端口自建配置文件:vim/usr/local/mongodb/etc/mongodb.confport=28888开......
  • 41 Typescript面向对象
    简介程序之中所有的操作都需要通过对象来完成举例来说:操作浏览器要使用window对象操作网页要使用document对象操作控制台要使用console对象一切操作都要通过对象,也就是所谓的面向对象,那么对象到底是什么呢?这就要先说到程序是什么,计算机程序的本质就是对现实事物的抽象,抽象......
  • Educational Codeforces Round 164 (Rated for Div. 2) D
    因为理解错了题目导致我没错出来。我理解为有两个人取球,每个人每次都是取一组,也就是一组的球必须要放在一个人手里。。因为我之前做的一个背包是这个样子的。这就导致了,我认为每次转移所需要的信息是比实际要的多很多的,直接导致我没法设计一个正常的dp。然后炸了。。。好烦。。......
  • CF416E 题解
    前置知识:floyd题意给定一个\(n\)个点\(m\)条边的无向简单图,对于每对\((s,t),1\les<t\len\),求出有多少条边被至少一个\(s\tot\)的路径经过。\(n\le500,m\le\frac{n(n-1)}{2}\)题解首先一个很一眼的做法先floyd一遍求出\(dis(i,j)\),接着枚举\((s,......
  • P1604 B进制星球
    P1604B进制星球题目描述话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用\(B\(2\leB\le36)\)进制计数。星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成\(B\)进制加法的计算器......