lua table继承和clone的骚操作(一)

原因

由于lua的弱类型动态语言的特质,克隆table的行为在lua中不说无处不在,那也是非常常见。

一般克隆table原因无外乎:

  • 通过修改旧table的部分数据创建新table,然后又不想由于修改新table而导致旧table被修改。从而保持函数的纯函数性。

方法

那怎么做到呢?有如下方法:

  1. 直接克隆。这种方式创建出来的table是全新的实例,怎么修改也不会影响到原table,缺点是在table较大的时候创建耗时较久,也会占用更多内存
function createNewTable(tb)
  local newTb = clone(tb)
  newTb.id = 2
  return newTb
end

local tbA = {a = 1}
local tbB = createNewTable(tbA)

print(tbB.a) -- 1
print(tbB.b) -- 2

tbB.a = 3
tbB.b = 4

print(tbB.a) -- 3
print(tbB.b) -- 4

tbB.a = nil
tbB.b = nil

print(tbB.a) -- nil
print(tbB.b) -- nil

  1. 通过元表将新修改的数据存储到新的table中。优点是创建速度快,占用内存少,修改的数据也会存储在新的table中,不会影响到原table。缺点是无法将原table中的变量赋值为空,且新的table无法用pairs和ipairs遍历到。
function createNewTable(tb)
    local newTb = setmetatable({}, {__index = tb})
    newTb.b = 2
    return newTb
end

local tbA = {a = 1}
local tbB = createNewTable(tbA)

print(tbB.a) -- 1
print(tbB.b) -- 2

tbB.a = 3
tbB.b = 4

print(tbB.a) -- 3
print(tbB.b) -- 4

tbB.a = nil
tbB.b = nil

print(tbB.a) -- 1
print(tbB.b) -- nil

-- 只会输出b=1, 遍历不到tbA中的数据
for k, v in pairs(tbB) do
    print(k, v)
end

克隆和元表实现的优缺点

克隆 元表
优点 创建出新table,可遍历 创建迅速,占用内存少
缺点 当被克隆的table较大的时候,耗时较久,并且占用内存较多 不可以设置原table已有的值为nil,不可使用pairs和ipairs遍历

预告

有没有一种方式创建出来的新table,可以兼顾克隆和元表两者的优点,既创建速度快,占用内存少,又可以肆意修改,并且完全不影响到原来的table还能支持遍历呢?

下篇见。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 转自转载 当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一...
    胤醚貔貅阅读 1,642评论 0 1
  • 当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形...
    Lee坚武阅读 2,546评论 0 51
  • 1.1程序块:Lua执行的每段代码,例如一个源代码文件或者交互模式中输入的一行代码,都称为一个程序块 1.2注释:...
    c_xiaoqiang阅读 2,585评论 0 9
  • 1.Lua 交互式编程 and 脚本式编程2.注释单行:--多行:--[[ --]] 多行推荐使...
    只猿阅读 513评论 0 1
  • 目标:利用泛型for写出高效迭代器 迭代器是一种支持指针类型的结构,可以便利集合中的每个元素。在Lua中常使用函数...
    JunChow520阅读 1,899评论 0 0