我正在尝试使用 Lua 制作一些条件,检查字符串中是否包含某些文本。不幸的是,当我编译它时,我得到了:
! LuaTeX error <main ctx instance>:4: bad argument #1 to 'find' (string expected, got nil)
stack traceback:
[C]: in function 'find'
<main ctx instance>:4: in function 'hasnumber'
<main ctx instance>:1: in main chunk.
我以为我的代码在 Lua 方面一定有问题,但我在 Stack Overflow 上确认了这一点(如何检查在 Lua 中的字符串中是否找到匹配的文本?string.find
) 我已经使用写入代码在条件中使用,因此我认为在将此代码合并到 ConTeXt 中的 Lua 函数中时可能犯了一些错误。
这是我的代码的过度简化版本,但存在同样的错误:
\startluacode
userdata = userdata or {}
function userdata.hasnumber()
if string.find(str, "2") then
str = "Has 2."
elseif string.find(str, "1") then
str = "Has 1."
else
str = "Has none."
end
context(str)
end
\stopluacode
\starttext
\ctxlua{userdata.hasnumber("The number 1 is here, as is 2")}
\ctxlua{userdata.hasnumber("This has no numbers.")}
\ctxlua{userdata.hasnumber("This only has 1")}
\stoptext
为什么string.find
报告说没有收到任何字符串?
答案1
string.find()
需要至少两个参数,要搜索的字符串和模式。你给出了两个参数,但第一个参数为 nil(这是错误消息)。为什么?因为在第 4 行( )中未定义if string.find(str, "2") then
变量。str
这是 Lua 参考手册中的条目:http://www.lua.org/manual/5.1/manual.html#pdf-string.find
未经测试:
\startluacode
userdata = userdata or {}
function userdata.hasnumber(str)
if string.find(str, "2") then
str = "Has 2."
elseif string.find(str, "1") then
str = "Has 1."
else
str = "Has none."
end
context(str)
end
\stopluacode
\starttext
\ctxlua{userdata.hasnumber("The number 1 is here, as is 2")}
\ctxlua{userdata.hasnumber("This has no numbers.")}
\ctxlua{userdata.hasnumber("This only has 1")}
\stoptext
该函数hasnumber
获得一个在函数str
中使用的参数()string.find()
。