Lua多行注释中如何使用']]'?

46

我正在尝试找到一种方法来在代码批处理中使用多行注释,但它会将其中一些语法错误地识别为“]]”,并认为我想要在那里结束,而实际上我不想要这样。

--[[
  for k,v in pairs(t) do
    local d = fullToShort[k]
    local col = xColours[v[1]] -- It stops here!
    cecho(string.format(("<%s>%s ", col, d))
  end
--]]

我记得在某处看到过,可以使用一种不同的组合方式来避免这些错误,例如--[=[或其他什么东西... 有人可以帮忙吗?

2个回答

74

如您在字符串教程中所见,有一个特殊的[===[语法用于嵌套方括号。您也可以在块注释中使用它。请注意,打开和关闭序列中=标记的数量必须相同。

例如,5个等号将起作用。

--[=====[ 
for k,v in pairs(t) do
   local d = fullToShort[k]
   local col = xColours[v[1]] -- It stops here!
   cecho(string.format(("<%s>%s ", col, d))
end
--]=====]

6
那几乎感觉像是一个临时应急的解决方案。我想知道他们为什么要这样做? - James
15
@James 这不是一种巧妙的处理方式,这是唯一 正确 的方法。其他固定的“魔术注释结束字符序列”(以下简称 MCCCS)基本上无法处理包含 MCCCS 本身的字符串。这就是为什么每次你想在 CDATA 中写入 ]]> 时,你最终会得到像 ]]]]><![CDATA[> 这样的 丑陋的东西。避免这种情况的唯一办法是提供成对的分隔符,其长度可以变化(或内容可以变化,如 bash HEREDOCs 中)。一个更好的问题应该是:为什么其他语言不像 Lua 一样做呢? - Andrey Tyukin
很酷,当在块注释中插入一个多行字符串并将其放置在[[]]之间时,它也能正常工作。在这种情况下,您还可以将=放置在嵌入式块中以区分其与包含块边界,例如使用 [=[]=] - hsandt
1
@AndreyTyukin OCaml 以一种优雅的方式解决了这个问题:注释必须包含有效的代码标记:(* "*)" *)(* … (* 嵌套注释 *) ... *) 都可以正常工作。它允许您对任何语法上有效的代码进行注释,而不会出现任何问题。 - bfontaine

-4

您可以使用以下内容来创建跨越]]的多行注释:

--[[
   codes
]]

答案反映了问题标题。我对此感到满意。好的做法是重新编写原始问题标题。 - Sany
我在注释中没有看到任何 ]] - Rick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接