【问题标题】:What's the point of nesting brackets in Lua?在 Lua 中嵌套括号有什么意义?
【发布时间】:2017-01-25 00:51:43
【问题描述】:

我目前正在自学用于 iOS 游戏开发的 Lua,因为我听说过很多关于它的好东西。该语言的文档水平给我留下了深刻的印象,这使得学习它变得更加容易。

我的问题是我发现了一个 Lua 概念,似乎没有人对此有“初学者”的解释:引号的嵌套括号。例如,我被教导带有转义单引号和双引号的长字符串,如下所示:

string_1 = "This is an \"escaped\" word and \"here\'s\" another."

也可以写成没有周围的整体引号。相反,只需用双括号替换它们,如下所示:

string_2 = [[This is an "escaped" word and "here's" another.]]

这两个对我来说都很有意义。但我也可以使用“嵌套括号”编写string_2 行,其中包括两组双括号之间的等号,如下所示:

string_3 = [===[This is an "escaped" word and "here's" another.]===]

我的问题很简单。 string_3 中使用的语法有什么意义?当作为print() 的输入给出时,它给出的结果与string_1string_2 相同,所以我不明白为什么甚至存在嵌套括号。有人可以帮助菜鸟(我)获得一些观点吗?

【问题讨论】:

    标签: string lua


    【解决方案1】:

    如果您的字符串包含等于分隔符的子字符串,则将使用它。例如,以下内容将无效:

    string_2 = [[This is an "escaped" word, the characters ]].]]
    

    因此,为了使其按预期工作,您需要使用不同的字符串分隔符,如下所示:

    string_3 = [===[This is an "escaped" word, the characters ]].]===]
    

    我认为可以肯定地说,没有很多字符串文字包含子字符串]],在这种情况下,可能永远没有理由使用上述语法。

    【讨论】:

    • 那么,所有嵌套括号所做的就是使容器“标签”与字符串不同?这样,string_3 将输出以下内容:
    • @elersong - 它可以帮助您将整个程序放在一个字符串中而不做任何更改:my_program = [=[print[[This is an "escaped" word]]]=]
    • 还应该指出的是,您可以以编程方式确定引用任意字符串所需的= 的计数,并且引用所述字符串不需要更改字符串本身的内容,只需将其包围适当的长字符串标记。
    • [[ ]] 字符串也是多行的。
    • 晚了,但您可以使用 ("%q"):format(string) 生成一个带引号的字符串,并应用所有必要的转义。
    【解决方案2】:

    这有助于嵌套它们:

    print [==[malucart[[bbbb]]]bbbb]==]
    

    将打印:

    malucart[[bbbb]]]bbbb
    

    但如果这还不够用,你可以使用它们将整个程序放在一个字符串中:

    loadstring([===[print "o m g"]===])()
    

    将打印:

    o m g
    

    我个人将它们用于我的静态/动态库实现。如果您不知道程序是否有一个带有相同数量 =s 的右括号,您应该使用以下内容来确定它:

    local c = 0
    while contains(prog, "]" .. string.rep("=", c) .. "]") do
      c = c + 1
    end
    -- do stuff
    

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 2013-04-23
      • 1970-01-01
      • 2013-06-15
      • 2019-12-18
      • 2019-01-03
      • 1970-01-01
      • 2019-10-13
      相关资源
      最近更新 更多