0

我有一个 lua 函数来尝试将当前播放歌曲的持续时间(例如 hh:mm:ss 转换为秒)。

function toSeconds (inputstr)
    local mytable = string.gmatch(inputstr, "([^"..":".."]+)");

    local conversion = { 60, 60, 24}
    local seconds = 0;
    --iterate backwards
    local count = 0;

    for i=1, v in mytable do
        count = i+1
    end

    for i=1, v in mytable do
        mytable[count-i]
        seconds = seconds + v*conversion[i]
    end
    return seconds
end

为了将其添加os.time到获取歌曲的估计结束时间。

但是时间可能会丢失,或者分钟可能会在短途上丢失。

当针对https://www.lua.org/cgi-bin/demo运行时,我得到的只是input:10: 'do' expected near 'in'

对于测试脚本

function toSeconds (inputstr)
    local mytable = string.gmatch(inputstr, "([^"..":".."]+)");

    local conversion = { 60, 60, 24}
    local seconds = 0;
    --iterate backwards
    local count = 0;

    for i=1, v in mytable do
        count = i+1
    end

    for i=1, v in mytable do
        mytable[count-i]
        seconds = seconds + v*conversion[i]
    end
    return seconds
end

print(toSeconds("1:1:1")
4

1 回答 1

2

您正在混合编写for循环的两种可能方式:

for i=1,10 do
   print(i, "This loop is for counting up (or down) a number")
end

b )

for key, value in ipairs({"hello", "world"}) do
   print(key, value, "This loop is for using an iterator function")
end

如您所见,i在这种情况下,第一个只是简单地计算一个数字。第二个是非常通用的,可用于迭代几乎任何东西(例如 using io.lines),但最常用于pairs和迭代表ipairs

你也不写for ... in tabtab表在哪里;你必须使用ipairs它,然后返回表的迭代器(这是一个函数)


您也使用string.gmatch不正确;它不返回表,而是返回字符串中模式匹配的迭代器函数,因此您可以像这样使用它:

local matches = {}
for word in some_string:gmatch("[^ ]") do
   table.insert(matches, word)
end

它为您提供了一个包含匹配项的实际表,但如果您只想遍历该表,您不妨gmatch直接使用循环。


for i=1, v in mytable do
   count = i+1
end

我想你只是想在这里计算表格中的元素?您可以使用运算符轻松获取表格的长度#,因此#mytable


如果你有一个类似的字符串hh:mm:ss,但小时和分钟可能会丢失,最简单的方法可能是用 0 填充它们。实现这一点的一个有点笨拙但简短的方法是附加"00:00:"到你的字符串,然后寻找最后3个数字:

local hours, minutes, seconds = ("00:00:"..inputstr):match("(%d%d):(%d%d):(%d%d)$")

如果没有遗漏任何内容,您最终会得到类似00:00:hh:mm:ss的内容,您只需使用 的最后 3 个值即可获得正确的时间。

于 2020-02-03T07:13:44.110 回答