如何在 ConTeXt 中使用 Lua 中的 string.find?

如何在 ConTeXt 中使用 Lua 中的 string.find?

我正在尝试使用 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()

相关内容