Lua 教程 在线

2083lua-for-loop.html

在lua中pairs与ipairs两个迭代器的用法相近,但有一点是不一样的:

pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;

但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key

2082Lua 数据库访问

5.2 版本之后,require 不再定义全局变量,需要保存其返回值。

require "luasql.mysql"

需要写成:

luasql = require "luasql.mysql"

2081Lua 面向对象

回楼上,两个新建实例并没有关系,只是新建实例时修改了元表,第二次新建覆盖了值:

local Rect = {area = 0,length = 0,windth = 0};
function Rect:new(length,windth)
  local t = {};
  setmetatable(t,self);
  self.__index = self;
  t.length = length;
  t.windth = windth;
  t.area = t.length * t.windth;
  return t;
end

function Rect:ShowArea()
    print(self.area);
end

local a = Rect:new(1,2);
local b = Rect:new(3,4);
a:ShowArea();
b:ShowArea();
print(a);    
print(b);

输出结果:

2
12
table: 0000000019AA22A0
table: 0000000019AA2610

2080Lua 面向对象

我的实测结果与作者的理论有出入,先创建多个对象,然后再依次输出,会发现结果都是最后一个对象的值。

Rectangle 的封装:

Rectangle = {area = 0, length = 0, breadth = 0}

function Rectangle:new (o,length,breadth)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  self.length = length or 0
  self.breadth = breadth or 0
  self.area = length*breadth;
  return o
end

function Rectangle:printArea ()
  print("矩形面积为 ",self.area)
end
-- 创建

local r = Rectangle:new(nil, 2, 3);
local p = Rectangle:new(nil, 4, 5);

-- 输出

r:printArea();
p:printArea();

结果:

矩形面积为     20
矩形面积为     20

也就是说,p 和 r 其实不是两个完全无关的对象。

2079Lua 面向对象

其中 A 为抽象类,B 为矩形类,C 为立方体类。

C 继承 B,B 继承 A。

类对象各自独立,不影响类默认成员属性值。

B = {length, width, area}

function B:new(len,wid)
    local A = {length=0,width=0}
    local o = {}
    setmetatable(o,A)
    B.__index=A
    o.length=len or A.length
    o.width=wid or A.width
    o.area=o.length*o.width
    return o
end

a=B:new(2,3)
b=B:new(3,4)
print("长方形a的面积为"..a.area)
print("长方形b的面积为"..b.area)
print("长方形a的面积仍然为"..a.area..", a与b独立存在")

c=B:new()
print("长方形c根据默认构造函数的面积为"..c.area..", c的长宽分别为",c.length,c.width)

--立方体C,继承长方形类B
C = {high=0, volume=0, rectangle=B.new()} --增加体积值和高度
C.__index=C        
function C:new(len, wid, hig)
    local o={}
    
    
    setmetatable(o,C)    --将原始类C作为它对象的原表
    
    o.rectangle=B:new(len,wid)
    o.high=hig or C.high
    o.volume=o.high*o.rectangle.area
    return o
end

cubeA=C:new(2,3,4)
cubeB=C:new(3,4,5)
print("立方体A的体积为"..cubeA.volume)
print("立方体B的体积为"..cubeB.volume)
print("立方体A的体积仍然为"..cubeA.volume..", A与B独立存在")

print("立方体A底面长方体的长与宽分别为"
    ,cubeA.rectangle.length
    ,cubeA.rectangle.width)
print("立方体B底面长方体的长与宽分别为"
    ,cubeB.rectangle.length
    ,cubeB.rectangle.width)
print("cubeA和cubeB的底边长方形同样独立存在")