Lua面向对象编程之基础结构table简例

面向对象编程

(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。

Lua中最基本的结构是table,所以需要用table来描述对象的属性。

Lua中的function可以用来表示方法。那么Lua中的类可以通过table + function模拟出来。

简例:

-- Czhenya Lua 面向对象
-- 对于一个对象来说, 属性 方法
--[[ 两种定义函数的方式
person.eat = function()
  print(person.name.."在写LUA")
end
function person.eat()
  print(person.name.."在写LUA")
end
--]]
--作为原型
Person = {name = 'Czhena',age = 22}
function Person:eat()
  print(self.name.."的年龄是"..self.age)
end
function Person:new(o)  -- 若o是空的则返回false
  local t = o or {}
  --[[ 和下面设置结果一样,只是两种不同的方式
  setmetatable{t,self}
  self.__index=self
  --]]
  setmetatable(t,{__index = self})  --设置元表
  --调用一个属性的时候,如果t中不存在,就会在__index所指的table中查找
  return t
end
-- 类似于通过构造函数创建对象
person1 = Person:new({weight = 100})
person2 = Person:new()
print(person1.name)
print(person1.weight)
print(person2.name)
person1.name = "CZY"  --不会改变元表,添加到person.name
person1:eat()
person2:eat()
--继承
Student = Person:new()
Student.grade = 1
stu1 = Student:new()
stu1:eat()
print(stu1.grade)

冒号和点定义函数的区别:

-- 使用冒号和点来的定义函数,建议用什么定义函数,用什么调用
person = {name="Czhenya",age=22}
function person:eat()
  print(self.name.."的年龄是"..self.age)
end
person.eat(person)
a = person
--冒号调用self自动赋值
a:eat()
--通过点来调用的时候,self不会自动赋值,必须通过参数传递
a.eat(a)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Lua中获取table长度问题探讨

    又有同事在lua的table长度问题上犯错了,我们一起来看看吧~~~ 看以下代码: 复制代码 代码如下: local tblTest1 =  {      1,      2,      3  }    print(table.getn(tblTest1)) 这段代码输出的结果是3,这个大家都知道,是吧.不管最后那个3后面有没有加逗号,结果都是3. 再看下面的代码: 复制代码 代码如下: local tblTest2 =  {      1,      a = 2,      3,  }   

  • C++遍历Lua table的方法实例

    Lua table数据如下: 复制代码 代码如下: --$ cat test.lua lua文件 user = {         ["name"] = "zhangsan",         ["age"] = "22",         ["friend"] = {                 [1] = {                     ["name"] = &quo

  • Lua中设置table为只读属性的方法详解

    项目中部分只读表易被人误改写,故决定在非线上环境里对这些表附加只读属性,方便在出现误改写的时候抛出lua错误,最终版代码如下: --[[------------------------------------------------------------------------------ -** 设置table只读 出现改写会抛出lua error -- 用法 local cfg_proxy = read_only(cfg) retur cfg_proxy -- 增加了防重置设置read_o

  • Lua Table转C# Dictionary的方法示例

    table特性 table是一个"关联数组",数组的索引可以是数字或者是字符串,所有索引值都需要用 "["和"]" 括起来:如果是字符串,还可以去掉引号和中括号: 即如果没有[]括起,则认为是字符串索引 table 的默认初始索引一般以 1 开始,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编: table 的变量只是一个地址引用,对 table 的操作不会产生数据影响 table 不会固定长度大小,有新数据插入时长度会自动增长 t

  • Lua中table里内嵌table的例子

    废话不多少,看代码: 复制代码 代码如下: local temp_insert_table_Data = {      x = "test3",        y = "test4",        z = "test5" ,  }    local temp_insert_table = {      x = 1,      y = 2,      z = 3,      {   a = -1, a1 = 1},      {   b = -2

  • Lua中table的遍历详解

    当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 复制代码 代码如下: for key, value in pairs(tbtest) do      XXX  end   for key, value in ipairs(tbtest) do      XXX  end   for i=1, #(tbtest) do      XXX  end   for i=1, table.maxn(tbtest)

  • Lua的table库函数insert、remove、concat、sort详细介绍

    函数列表: table.insert(table,[ pos,] value) table.remove(table[, pos]) table.concat(table[, sep[, i[, j]]]) table.sort(table[, comp]) 1. insert 和 remove 只能用于数组元素的插入和移出, 进行插入和移出时,会将后面的元素对齐起来. 所以在 for 循环中进行 insert 和 remove 的时候要注意插入和移除时是否漏掉了某些项:   复制代码 代码如下

  • Lua中获取table长度的方法

    官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长度是它的字节数(就是以一个字符一个字节计算的字符串长度). table t 的长度被定义成一个整数下标 n . 它满足 t[n] 不是 nil 而 t[n+1] 为 nil: 此外,如果 t[1] 为 nil ,n 就可能是零. 对于常规的数组,里面从 1 到 n 放着一些非空的值的时候, 它的长度就精确的为 n,即最后一个值的下标. 如果数组有一个"空洞" (就是说,nil 值被夹在非空值之间), 那么 #t 可能是

  • Lua table中安全移除元素的方法

    在Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏. 引子 比如有些朋友常常这么做,大家看有啥问题 将test表中的偶数移除掉 复制代码 代码如下: local test = { 2, 3, 4, 8, 9, 100, 20, 13, 15, 7, 11} for i, v in ipairs( test ) do     if v % 2 == 0 then         table.remove(test, i)     end end fo

  • Lua编程示例(一):select、debug、可变参数、table操作、error

    function test_print(...) for i=1,select("#",...) do print(i,select(i,...)) end end test_print(11,12,13,14) print() print(debug.traceback()) print() function test(...) for i=1,arg.n do print(i.."\t"..arg[i]) end end test("a",2

  • 举例讲解Lua中的Table数据结构

    文中-- 两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]]. 复制代码 代码如下: -- Table = Lua唯一的数据结构; --         它们是关联数组. -- 类似于PHP的数组或者js的对象, -- 它们是哈希查找表(dict),也可以按list去使用. 复制代码 代码如下: -- 按字典/map的方式使用Table: -- Dict的迭代默认使用string类型的key: t = {key1 = 'value1', key2 = false} 复制代码 代

  • 深入谈谈lua中神奇的table

    前言 最近在尝试配置 awesome WM,因此粗略地学习了一下 lua . 在学习过程中,我完全被 table 在 lua 中的应用所镇住了. table 在 lua 中真的是无处不在:首先,它可以作为字典和数组来用; 此外,它还可以被用于设置闭包环境.module; 甚至可以用来模拟对象和类 字典 table 最基础的作用就是当成字典来用. 它的 key 值可以是除了 nil 之外的任何类型的值. t={} t[{}] = "table" -- key 可以是 table t[1]

  • Lua中释放table占用内存的方法

    table的大小是动态变化的.看如下代码: 复制代码 代码如下: tb = {1,2,3} --数组大小4,hash表大小1(不管hash表有没有存数据,它的大小最小为1)    tb[5] = 5  tb[100] = 100 --数组大小4,hash表大小2 因为后插入的两个数的key过于离散,所以它们被保存到hash表中.最终tb的大小为4+2=6. 这时我们对table进行删除操作: 复制代码 代码如下: tb[1] = nil  tb[2] = nil  tb[3] = nil  tb

随机推荐