gpt4 book ai didi

lua 测试并分配内部循环控制

转载 作者:行者123 更新时间:2023-12-01 08:28:47 24 4
gpt4 key购买 nike

是否有/请建议一种语法来在 lua 中实现紧凑的“测试和分配”?

考虑 luasql 示例中的这一段 (http://keplerproject.org/luasql/examples.html)

-- retrieve a cursor
cur = assert (con:execute"SELECT name, email from people")
-- print all rows, the rows will be indexed by field names
row = cur:fetch ({}, "a")
while row do
print(string.format("Name: %s, E-mail: %s", row.name, row.email))
-- reusing the table of results
row = cur:fetch (row, "a")
end

我正在学习 lua,并且真的很难接受对 cur:fetch() 的重复调用。我看到重复/直到微不足道地解决了这个问题,但似乎我必须测试两次:

repeat
row = cur:fetch ({}, "a")
if row then
print ...
end
until nil == row

我认为这对于“row = ...”变得更复杂的情况不太容易出错,但似乎仍然不优雅。

最佳答案

您可以将第一个循环简化为:

local row = {}
while row do
row = cur:fetch(row, "a")
end

编辑:sample page使用 iterators 找到可能的解决方案和一个 for 循环,就像@doukremt 建议的那样。不幸的是,它还包含一些错误(它假设行在第二个示例中“解包”但在第一个示例中没有,没有声明所有 local,并且省略了比在 a示例代码)。以下是在迭代器中转换光标的方法:

local iterate = function(cur)
return function() return cur:fetch() end
end

这是你如何使用它:

local cur = assert(con:execute("SELECT name, email from people"))

for row in iterate(cur) do
print(string.format ("%s: %s", row.name, row.email))
end

我必须警告您,迭代器通常比 while/repeat 循环更昂贵。如果您担心速度,请执行性能测试。

关于lua 测试并分配内部循环控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com