精华内容
下载资源
问答
  • Lua的String字符串拼接

    千次阅读 2020-08-02 22:08:23
    Lua的String字符串拼接 每个语言都会遇到字符串拼接的问题。上回说到C#的字符串拼接Concat,我们知道C#中拼接许多字符串一般不用“+”号,因为每次+操作都会产生一个临时的字符串。所以C#里面就提供了StringBuilder...

    Lua的String字符串拼接

    每个语言都会遇到字符串拼接的问题。上回说到C#的字符串拼接Concat,我们知道C#中拼接许多字符串一般不用“+”号,因为每次+操作都会产生一个临时的字符串。所以C#里面就提供了StringBuilder–可变字符串来拼接,直到最后tostring的时候才会产生最终的string字符串。

    Lua语言里面默认是” …“两个英文点号来表示字符串的拼接。但是当我们需要拼接多个字符串的时候,同样的思路table.concat

    table.concat (list [, sep [, i [, j]]])
    

    Lua提供一个列表,其所有元素都是字符串或数字,返回字符串 list[i]..sep..list[i+1] ··· sep..list[j]sep 的默认值是空串, i 的默认值是 1 , j 的默认值是 #list 。 如果 ij 大,返回空串。

    也就是说我们可以将下面这段代码

    function Concat(...)
        local origin = {...}
        local message = ""
        for i,v in pairs(origin) do
           message = message .. v
        end
        return message
    end
    

    改成

    function Concat(...)
        local message = {...}
        return table.concat(message)
    end
    

    原理

    这里参考https://www.lua.org/pil/11.6.html网站上面的示例,简单介绍一下table.concat

    假设现在正在逐行读取文件

      -- WARNING: bad code ahead!!
        local buff = ""
        for line in io.lines() do
        buff = buff .. line .. "\n"
        end
    

    Lua使用了真正的垃圾收集算法;当它检测到程序正在使用过多的内存时,它将遍历其所有数据结构并释放那些不再使用的结构(垃圾)。

    让我们假设我们处于读取循环的中间。 buff已经是一个50 KB的字符串,每行有20个字节。当Lua串联时buff..line.."\n",它将创建一个具有50,020字节的新字符串,并将50 KB复制buff到该新字符串中。也就是说,对于每条新行,Lua都会移动50 KB的内存并不断增长。读取100行后(仅2 KB),Lua已经移动了5 MB以上的内存。

        buff = buff .. line .. "\n"
    

    经过两个循环之后,有两个旧字符串构成了总计超过100 KB的垃圾。因此,Lua相当正确地决定,现在是运行其垃圾收集器的好时机,因此它释放了这100 KB。问题是,这将每两个周期发生一次,因此Lua将在读取整个文件之前运行其垃圾收集器2000次。即使完成所有这些工作,它的内存使用量也将大约是文件大小的三倍。

    使用concat,我们可以简单地将所有字符串收集在一个表中,然后一次将它们全部连接起来。 因为concat使用C实现,所以即使对于大字符串也很有效。

    然后将上面的代码改造一下

    local t = {}
    for line in io.lines() do
      	table.insert(t, line)
    end
    s = table.concat(t, "\n") .. "\n"
    

    综上:Lua连大量字符串的时候使用table.concat

    参考:https://www.lua.org/pil/11.6.html

    参考:http://cloudwu.github.io/lua53doc/manual.html#pdf-table.concat

    展开全文
  • 零、字符串拼接除了下方所述的方法还有string.format(...),但是这个不适合拼接大量字符串,故不说明。 一、大量字符串拼接方式 1. 使用运算符.. 2. 使用table.concat (table [, sep [, start [, end]]])函数 ...
    零、字符串拼接除了下方所述的方法还有string.format(...),但是这个不适合拼接大量字符串,故不说明。
    一、大量字符串拼接方式
    1. 使用运算符..
    2. 使用table.concat (table [, sep [, start [, end]]])函数

    二、实验
    1. 代码
    function operatorConcat(str,count)
        local result = ""
        for i=1,count do
            result = result .. str
        end
        return result
    end

    function tableConcat(str,count)
        local tbl = {}
        for i=1,count do
            table.insert( tbl,str)
        end
        return table.concat(tbl)
    end


    local str = "a"
    local count = 100000

    local start_time = os.clock()
    operatorConcat(str,count)
    print("operatorConcatTime:" .. os.clock() - start_time)

    start_time = os.clock()
    tableConcat(str,count)
    print("tableConcatTime:" .. os.clock() - start_time)
    2. 结果
        从图中看到,将100000个str="a"拼接成新的字符串,运算符..的时间是0.55919s,而table.concat()函数时间为0.023939s,差距20+倍。

    三、原因分析
    1. 使用运算符..
        每次拼接都需要申请新的空间,旧的result对应的空间会在某时刻被Lua的垃圾回收期GC,且随着result不断增长,越往后会开辟更多新的空间,并进行拷贝操作,产生更多需要被GC的空间,所以性能降低。
    2. 使用table.concat (table [, sep [, start [, end]]])函数
        table.concat 底层拼接字符串的方式也是使用运算符.. ,但是其使用算法减少了使用运算符..的次数,减少了GC,从而提高效率。主要思路:采用二分思想,用栈存储字符串,新入栈的字符串与下方的字符串比较长度,大于则使用运算符..拼接成新字符串,并移除栈顶的字符串,不断向下直至遇到长度更大的字符串或者栈底,这样保持最大的字符串位于栈底,栈呈现金字塔的形状,最终在使用运算符..将栈中的字符串拼接成最终的字符串。
    四、参考链接
    http://www.lua.org/pil/11.6.html
    http://www.jb51.net/article/55124.htm

    展开全文
  • lua 字符串缓冲

    2019-06-05 13:07:33
    -- 字符串拼接低效操作 -- 读取整个文件的内容,保存在变量中 local buff = "" for line in io.lines() do buff = buff .. line .. "\n" end --[[ 代码说明: 1. io.lines()默认不读取换行'\n',所以在最后添加换...
    --[[
    字符串缓冲
    ]]
    
    -- 字符串拼接低效操作
    -- 读取整个文件的内容,保存在变量中
    
    local buff = ""
    for line in io.lines() do
    	buff = buff .. line .. "\n"
    end
    
    --[[
    代码说明:
    1. io.lines()默认不读取换行'\n',所以在最后添加换行符
    2. lua里字符串是常量,即不可修改,当执行buff = buff .. line .. "\n"时,
    会重新申请一段内存,将原来buff里的值拷贝到新的buff中,然后将line的值和‘\n’拷贝到buff中
    3. lua虚拟机会进行垃圾回收,当可回收的内存达到一定值,会进行垃圾回收。
    所以原来buff占用的内存累计起来会不断被回收掉,导致执行效率较低。
    ]]
    
    --[[ 实际上,通常使用io.read("*all")操作读取整个文件。
    但是当文件大小大于机器内存时,这种方法就使用不了。
    这时可以利用io.read("*all")的实现原理自己实现效率较高的读取文件的操作。
    ]]
    
    function newStack()
    	return {""} -- 栈底是空字符串
    end
    
    function addString(stack, str)
    	table.insert(stack, str) -- 字符串入栈
    
    	for i = table.getn(stack) - 1, 1, -1 do
    		if string.len(stack[i]) > string.len(stack[i + 1]) then
    			break
    		end
    
    		 -- 上一个字符串比下一个字符串长,就将上一个字符串合并到下一个字符串里
    		stack[i] = stack[i] .. table.remove(stack)
    	end
    end
    
    local s = newStack()
    for line in io.lines() do
    	addString(s, line .. "\n")
    end
    
    
    s = table.concat(s, "\n") --这里有一个问题,最后没有换行符
    print(s)
    
    -- 其中一个解决办法是:
    s = table.concat(s, "\n")
    s = s .. '\n' --这种方法里会进行字符串的拷贝,效率较低
    print(s)
    
    -- 另一种方法是:
    table.insert(s, '\n')
    s = table.concat(s, "\n")
    print(s)

     

    展开全文
  • Lua按编号拼接字符串

    2019-10-12 21:53:21
    本文接《C++按编号拼接字符串》,给出Lua版本,具体就不详述了。直接上代码。 1. 简单拼接 function sprintf_x(fmt, ...) local args = {} local i = 1 local xfmt = string.gsub(fmt, "%%%s*(%d+)", function(n)...

      本文接《C++按编号拼接字符串》,给出Lua版本,具体就不详述了。直接上代码。

    1. 简单拼接

    function sprintf_x(fmt, ...)
        -- local arg = {...} -- lua5.1以上的版本,后面的arg.n改成#arg
        local xfmt = string.gsub(fmt, "%%%s*(%d+)", function(n)
                                                        n = tonumber(n)
                                                        if n and n >= 1 and n <= arg.n then
                                                            return arg[n]
                                                        end
                                                        return ""
                                                    end)
        return xfmt
    end
    

      用“..”连接的,可以用sprintf_x来替代:

    "学" .. "Lua" .. ",从" .. "入门" .. "到" .. "精通" .. ",只需" .. 210 .."天"
    -- 可以替换为:
    sprintf_x("学%1,从%2到%3,只需%4天", "Lua", "入门", "精通", 210)
    

    2. 精细化拼接

    function sprintf_y(fmt, ...)
        -- local arg = {...} -- lua5.1以上的版本,后面的arg.n改成#arg
        local xfmt = string.gsub(fmt, "%%%s*(%d+)", function(n)
                                                        n = tonumber(n)
                                                        if n and n >= 1 and n * 2 <= arg.n then
                                                            return string.format(arg[n * 2], arg[n * 2 - 1])
                                                        end
                                                        return ""
                                                    end)
        return xfmt
    end
    

      用string.format(fmt, …)格式化的,可以用sprintf_y来替代:

    string.format("学%.3s,从%s到%s,只需%-4d天", "Lua", "入门", "精通", 210)
    -- 可以替换为:
    sprintf_y("学%1,从%2到%3,只需%4天", "Lua", "%.3s", "入门", "%s", "精通", "%s", 210, "%-4d")
    
    展开全文
  • local components_url_tree = { main_wid =  { left_part =  { purple_flag =  { purple_flag_title = {}, }, talisman_name_bg =  { talisman_name = {}, }, talisman_sv_container = ...cell_tmp
  • Lua中的九九乘法表以及字符串拼接

    千次阅读 2016-12-22 11:40:56
    for m=1,9 do // for循环1到9 local s = "" // 定义一个用来输出的字符串S for n=1,9 do // 内层循环1到9 if n 注
  • for m=1,9 do // for循环1到9 local s = "" // 定义一个用来输出的字符串S for n=1,9 do // 内层循环1到9 if n 注
  • 最近在写一些简单的 lua,涉及到读文件 该文件是在 windows 上编写的,然后会在 linux 下用读此文件 然后就出现了一下情况: local cmd = 'ls -F '..path..' | grep \'[^/]$\'' 我的 path 在文件中看来是:/root/...
  • lua脚本处理json 并拼接字符串

    千次阅读 2018-07-13 23:07:44
    1,下载cjson并安装 sudo wget https://www.kyne.com.au/~mark/software/download/...sudo tar zxvf lua-cjson-2.1.0.tar.gz cd lua-cjson-2.1.0 sudo make 2,代码 local cjson = require "cjson" ...
  • LUA教程字符串缓冲-46

    千次阅读 2020-07-15 09:43:06
    假定你要拼接很多个小的字符串为一个大的字符串,比如,从一个文件中逐行读入字符串。你可能写出下面这样的代码: -- WARNING: bad code ahead!! local buff = "" for line in io.lines() do buff = buff .. line...
  • lua】string字符串

    2019-12-16 19:11:12
    string :字符串 – 是由一对双引号或者单引号定义的 – 也可以用 2 个方括号 “[[]]” 来表示"一块"字符...–print(“error”+1)–报错 error1 rror 1 字符串拼接用… print(“error”…1) – error1 –字符串长...
  • str = "abcd"; str1 = "我"; --#str 可以获取字符串长度 print(#str);--4 -- 一个汉字占3个长度(在utf-8中是3个,gbk中是两个。和编码有关) ...-- 字符串拼接 str = "123".."456"; print(str);--12345
  • --从从控制台输入字符串操作 str =io.read() ...--lua中的字符串拼接操作 str="hello" str2="world" str3=str..str2 print(str3) --lua中的number与string类型的转换 a=10 b=tostring(a) if b == "10" then
  • --从从控制台输入字符串操作 str =io.read() ...--lua中的字符串拼接操作 str="hello" str2="world" str3=str..str2 print(str3) --lua中的number与string类型的转换 a=10 b=tostring(a) if
  • 子串:任意删除字符后剩余的字符顺序拼接的串;字符串比较:逐字符比较 如: abcab -> cb iabvxcjhiojb ->...思路:第一步找到字符串中最大的字符拿出来,在这个字符后面取剩下的字符串,...
  • Lua(五)字符串操作

    2019-05-29 17:28:09
    字符串操作 拼接 a = 'aa' b = 'bb' c = a..b print(c) ---> aabb 大小写转换 a = 'abc' b = 'ABC' c = string.upper(a) d = string.lower(b) print(c) print(d) ---> ABC abc 替换 a = '...
  • 触动精灵使用lua实现对...字符串拼接使用.., 例如"hello".." world" 调用对象对应的方法需要用冒号,比如var_a:func() 表(字典)定义语法和python唯一的区别是key不用加引号,后面=值, 例如table={id=1, value="wtf"} .
  • 一:Lua 里的字符串由一对双引号或单引号来表示。 二:C# 和 Lua 算术操作的区别。 三:Lua 里的字符串拼接。 四:Lua 中如何求字符串的长度?
  • `Lua``Lua`语言语法`Lua`标识符`Lua`关键字`Lua`全局变量`Lua`数据类型nil(空)boolean(布尔)number(数字)string(字符串)注意(关于字符串拼接和+):算术运算时的“+”字符串的拼接字符串长度的测量table(表)table...
  • Lua教程

    2020-03-10 17:11:40
    table作为对象和类的基础,table索引,算术操作符,字符串拼接,顺序比较,函数调用, Lua作为无限制免费软件发布, Lua3.x 我们解决了fallback冲突问题。我们将fallback替换为tag方法:钩子是以(event, tag)的形式挂...
  • lua语言快速入门

    千次阅读 2021-01-06 09:54:43
    和大部分语言使用 + 不同,Lua 中使用两个点号来拼接字符串: print('hello' .. ', world') 2.3 只有 table 这一种数据结构 Lua 中只有一种数据结构,那就是 table,它里面可以包括数组和哈希表: local col
  • 开发错误记录

    2017-04-27 16:43:00
    1. lua 字符串拼接 bool 报错的,得把bool用tostring转为string. 2.lua 文件操作不支持中文路径 3. 打包APK,在编译中发现编译错误,经过检查代码发现函数中定义结构体,然后使用,报错 转载于:...
  • Lua优化技巧

    2020-04-04 09:30:09
    1.大量字符串拼接使用 table.concat() 不能使用…
  • LuaLua转义符的使用

    千次阅读 2016-11-25 17:55:48
    虽然lua字符串拼接“string.format”相对于“..”消耗较大,但有时为了代码的可读性,项目中还是经常用到“string.format”。至于这两个用法的性能看源码也很容易看出来,这里就简单说一下,前者其实调用C函数str_...
  • lua基础笔记

    2019-08-27 20:05:49
    lua笔记 –** ## 1.注释 ** –单行注释 ...–2....–创建文件保存为.lua,然后运行 ...–3....–字符串拼接 … function test2() local a="aaa" local b="bbb" --输出 --不换行输出:io.wr...
  • Lua学习笔记 运算符

    2021-02-08 12:35:25
    -- 字符串与number类型 相加 + 时,如果字符串是数字,则会是进行数字相加,而不是字符串拼接字符串拼接用的是 .. 运算符 print("123.5" + 1)--124.5 -- 多了幂运算 print("2的3次方:".. 2 ^ 3); -- 条件运算符。...

空空如也

空空如也

1 2 3 4
收藏数 72
精华内容 28
关键字:

lua字符串拼接