具有嵌入式功能的Lua String [[..]]

时间:2014-10-03 05:05:38

标签: string lua

我正在研究如何在lua字符串中嵌入lua函数(双括号)。只是为了阐述我的案例:

example.lua:

function my_message(msg)
    return "Your message: " + msg
end

function makeString()
    page = [[
        <html>
            <body>
<!-- 
        I want to call my_message(..) lua function and embed the value here. 
        What is the best way to achieve this? 
-->
            </body>
        </html>
    ]]
end

提前致谢。

3 个答案:

答案 0 :(得分:1)

不支持在字符串文字中嵌入值。

或者,您可以拆分字符串并将其与my_message的返回值连接起来,如下所示:

page = [[
    <html>
        <body>
<!-- 
]] ..
assert(load("return '" .. my_message("hello" .. "'")))()
.. [[    
-->
        </body>
    </html>
]]

在Lua 5.1中,使用loadstring代替load。另请注意,Lua将..中的字符串与+中的my_message联系起来,而不是{{1}}。

答案 1 :(得分:1)

使用gsub并不太难,因为它接受函数作为替换字符串。您需要提供一个特殊标记,例如{my_message:something}表示它将替换为my_message('something')调用的结果:

function my_message(msg)
    return "Your message: " .. msg
end
local map = {my_message = my_message}
function makeString()
    local page = ([[
        <html>
            <body>{my_message:something else}</body>
        </html>
    ]]):gsub("%{([%w_]+):(.-)%}", function(f, s)
      return map[f] and map[f](s) or "can't find "..f.. " function to call"
    end)
    return page
end
print(makeString())

这会将{my_message:something else}替换为Your message: something else,这可能对您有用。

答案 2 :(得分:0)

我会使用现有的模板库。

例如: