【问题标题】:Concatenation of strings in LuaLua中的字符串连接
【发布时间】:2023-03-17 02:20:02
【问题描述】:

在许多语言中,您可以在变量赋值时连接字符串。我有一个场景,使用 Lua 编程语言,我需要将命令的输出附加到现有变量。 Lua 中是否有与以下示例等效的功能?

其他语言示例:

===== PERL =====
$filename = "checkbook";
$filename .= ".tmp";
================

===== C# =====
string filename = "checkbook";
filename += ".tmp";
===============

提前感谢您的帮助。

【问题讨论】:

  • 对于那些通过“Lua 如何加入字符串”请求访问这篇文章的人,请考虑来自 Google 的第二个链接。谁在寻找Array.join(' ') Ruby/JS 模拟。它是 Lua 中的 table.concat(table [, sep [, i [, j]]])

标签: lua concatenation


【解决方案1】:

正如其他答案所说,Lua 中的字符串连接运算符是两个点。

你的简单例子应该是这样写的:

filename = "checkbook"
filename = filename .. ".tmp"

但是,有一点需要注意。由于 Lua 中的字符串是不可变的,因此每次连接都会创建一个新的字符串对象并将数据从源字符串复制到它。这使得对单个字符串的连续连接具有非常差的性能。

这种情况下的 Lua 习语是这样的:

function listvalues(s)
    local t = { }
    for k,v in ipairs(s) do
        t[#t+1] = tostring(v)
    end
    return table.concat(t,"\n")
end

通过在数组t 中收集要连接的字符串,可以使用标准库例程table.concat 将它们全部连接起来(以及每对之间的分隔字符串),而无需进行不必要的字符串复制。

更新:我刚刚注意到我最初使用pairs() 而不是ipairs() 编写了上面的代码sn-p。

正如最初编写的那样,函数listvalues() 确实会从传入的表中生成每个值,但不是以稳定或可预测的顺序。另一方面,它将包括在1#s 的范围内的键不是正整数的值。这就是pairs() 所做的:它生成存储在表中的每一个(键、值)对。

在大多数情况下,您会使用listvaluas() 之类的东西,您可能会对保留它们的顺序感兴趣。因此,编写为listvalues{13, 42, 17, 4} 的调用将按该顺序生成包含这些值的字符串。但是,pairs() 不会这样做,它会以某种顺序逐项列出它们,这取决于表数据结构的底层实现。众所周知,顺序不仅取决于键,还取决于插入键和移除其他键的顺序。

当然ipairs() 也不是一个完美的答案。它仅枚举形成“序列”的表的那些值。也就是说,那些作为键的值形成了一个从 1 到某个上限的完整块,这(通常)也是 # 运算符返回的值。 (在许多情况下,函数ipairs() 本身最好用更简单的for 循环代替,该循环从1 计数到#s。这是Lua 5.2 和LuaJIT 中推荐的做法,其中更简单的for循环可以比ipairs() 迭代器更有效地实现。)

如果pairs() 确实是正确的方法,那么通常情况下您希望同时打印键和值。这通过使数据自描述来减少对顺序的担忧。当然,由于任何 Lua 类型(nil 和浮点 NaN 除外)都可以用作键(NaN 也可以存储为值),因此查找字符串表示形式留作练习学生。不要忘记树和更复杂的表格结构。

【讨论】:

  • table.concat 在定义递归表时无法正常工作。例如:T={1,2,3}; T[4]=T 它在表中的索引 4 处为 'concat' 抛出错误“无效值(表)”
【解决方案2】:

如果您询问是否有运算符 .. 的简写版本 - 不,没有。你不能写a ..= b。您必须完整输入:filename = filename .. ".tmp"

【讨论】:

    【解决方案3】:

    串联:

    Lua 中的字符串连接运算符用两个点('..')表示。如果两个操作数都是字符串或数字,则根据第 2.2.1 节中提到的规则将它们转换为字符串。否则,调用“concat”元方法(参见 §2.8)。

    来自:http://www.lua.org/manual/5.1/manual.html#2.5.4

    【讨论】:

      【解决方案4】:

      可以使用连接运算符“..”将字符串连接在一起

      这对于我认为的变量是一样的

      【讨论】:

        【解决方案5】:

        你会使用的其他语言:

        // C#
        
        string a = "Hello";
        
        // 2 Options
        a = a + " World!";
        
        // or the easier way:
        a += " World!";
        

        现在在 Lua 中:您可以使用 .. ,这里是一个示例:

        -- Lua
        
        local a = "Hello"
        
        -- Sadly Lua doesn't have += so you have to do it this way.
        a = a.." World!";
        

        【讨论】:

          猜你喜欢
          • 2020-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-18
          相关资源
          最近更新 更多