Lua中实现StringBuffer功能_Lua

在Lua中,字符串是一个常量,如果用字符串连接符“..”把2个字符串连接起来,例如first_str = first_str .. second_str,那么原来的first_str和second_str就会作为垃圾等待回收,first_str引用的是一个新的字符串,如果在程序里面有大量的字符串连接操作的话,性能会十分低下。Lua是一个很简洁的语言,他没有StringBuffer的实现,但是其实我们可以动手写一个简单的StringBuffer实现,来避免性能的问题。

首先定义一个叫StringBuffer的table,使得这个StringBuffer被调用的时候看起来像是面向对象的样子 :)
然后分别定义两个方法append和tostr,实现的原理就是:append用table来保存所有字符串,tostr把保存了字符串的table用concat转成真正的字符串。

复制代码 代码如下:

StringBuffer = {}
StringBuffer.append =  function(t, str)
if t and str then
    table.insert(t, str)
end
end
StringBuffer.tostr =  function(t)
if t then
    return table.concat(t)
end
end
StringBuffer.new = function() return {} end

调用的时候大概如下,摘录了一段代码。。。

复制代码 代码如下:

all_assets = StringBuffer.new()
for asset in ctx:allassets() do
    StringBuffer.append(all_assets, asset:id())
    StringBuffer.append(all_assets, ', ')
end
result = StringBuffer.tostr(all_assets)
print (result)

在Lua中实现这样的一个StringBuffer,既可以避免潜在的性能问题,又可以使得代码看起来更加易懂~好了,重构以前的代码去了。。。

时间: 2024-07-30 04:16:43

Lua中实现StringBuffer功能_Lua的相关文章

Lua中的闭包小结_Lua

前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结.希望对大家学习Lua有帮助. 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: 复制代码 代码如下: function newCounter()      local i = 0      return function () -- 匿名函数           i = i + 1           return i      end

Lua中的table浅析_Lua

Lua的table提供了Map的功能,实现了"关联数组",并且整数.字符串甚至nil都可以作为索引/key:table没有固定的大小.   基于table,可以表示普通数组.符号表.集合.记录.队列和其他数据结构.   而Lua也是通过table来解决模块(module).包(package)和对象(Object)的. 例如io.read表示使用"read"来索引table io.   在Lua中,table既不是值也不是"变量",而是对象,可以

Lua中的metatable介绍_Lua

setmetatable (table, metatable) Lua 中的每个值都可以用一个 metatable. 这个 metatable 就是一个原始的 Lua table , 它用来定义原始值在特定操作下的行为. 你可以通过在 metatable 中的特定域设一些值来改变拥有这个 metatable 的值 的指定操作之行为. 举例来说,当一个非数字的值作加法操作的时候, Lua 会检查它的 metatable 中 "__add" 域中的是否有一个函数. 如果有这么一个函数的话,

Lua中的迭代器浅析_Lua

今天学习的内容还蛮有意思的,让我兴奋了一下~ 1.迭代器 什么是迭代器?别傻了,我最讨厌的就是名词解释了,反正就是用来遍历集合的一种方式. 比如,我们最常用的pairs,如下代码: 复制代码 代码如下:     local t = {"fdsd", "445"};        for k, v in pairs(t) do         print("k=" .. k .. ", v=" .. v);     end  

Lua字符串模式匹配函数小结_Lua

模式匹配函数 在string库中功能最强大的函数是: 复制代码 代码如下: string.find(字符串查找) string.gsub(全局字符串替换) string.gfind(全局字符串查找) string.gmatch(返回查找到字符串的迭代器) 这些函数都是基于模式匹配的.与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配.主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比

Lua中实现sleep函数功能的4种方法_Lua

一个不幸的消息是Lua中没有内置sleep函数,我们需要DIY.有4种方法可以实现sleep函数,如下: 方法1 复制代码 代码如下: --在一个死循环中设置一个跳出条件,但是这样的做法会占用大量CPU资源,强烈不推荐使用哦 function sleep(n)    local t0 = os.clock()    while os.clock() - t0 <= n do end end 方法2 复制代码 代码如下: --调用系统的sleep函数,不消耗CPU,但是Windows系统中没有内置

Lua中的文件I/O操作教程_Lua

 Lua中I/O库用于读取和处理文件.有两种类型的文件操作,在Lua即隐含文件的描述符和明确的文件描述符. 对于下面的例子中,我们将使用一个示例文件test.lua,如下图所示. 复制代码 代码如下: -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用下面的语句. 复制代码 代码如下: file = io.open (filename [, mode]) 各种文件模式列示于下表中.  隐文件描述符 隐文件描述符使用标准输入/输出模式,或使用单

Lua中的函数精讲笔记_Lua

函数的用途: 1.完成指定的任务,这种情况下作为调用语句使用. 2.计算并返回值,这种情况下,函数作为赋值语句的表达式使用. 函数的参数为空,必须使用()表示函数调用.例外:当函数只有一个参数,并且这个参数是字符串或表构造时,()是可选的. lua提供了面向对象调用函数的语法 o:foo(x)与o.f(o,x)是等价的. lua函数的实参与形参的匹配与赋值语句类似,多余部分被忽略,缺少部分nil补足. lua函数可以返回多个值,return后列出要返回值的列表即可返回多值 复制代码 代码如下:

Lua中模块以及实现方法指南_Lua

从使用的角度来看,一个模块就是一个程序库,可以通过Lua自身提供的require来加载.然后便得到一个全局变量,表示一个table.这个table就是像一个名字空间,其内容就是模块导出的所有东西,例如函数和常量.简单的说,Lua中的模块就是一个table,table中可以包括任何东西.本文首先详细介绍模块相关的require函数,包括该函数的执行流程以及查找模块的路径,然后介绍了实现模块的三种方法,并给出相应的优缺点.  require函数      该函数用来加载一个模块,即按指定的路径和传入