gpt4 book ai didi

iterator - 有没有一些聪明的方法来编写 lua 对象,使其兼作迭代器?

转载 作者:行者123 更新时间:2023-12-03 01:14:34 25 4
gpt4 key购买 nike

假设我有一些在其他地方定义的“对象”。也许它代表一组项目,但比简单的表格更复杂。无论它是什么,迭代它都是合乎逻辑的。

因此,它定义了一个iterator方法。所以我可以这样写:

local myObject = AbstractObject:new()

for obj in myObject:iterator() do
obj:foo()
end

我想知道是否有一些我可以做的元方法技巧,这将允许我写这个:

local myObject = AbstractObject:new()

for obj in myObject do
obj:foo()
end

有吗?

最佳答案

对示例进行一点小小的更改将使语义变得不那么痛苦:

local myObject = AbstractObject:new()

for obj in myObject() do
obj:foo()
end

这样,您就可以使用元表来定义 __call 元方法来返回 myObject:interator(),其代码与 AbstractObject 中类似:new():

setmetatable(newobject, {__call = function() return newobject:iterator() end})
<小时/>

如果没有迭代器构造,您将有效地重用单个迭代器进行多次迭代,这意味着您需要将迭代器状态保留在对象/创建闭包中,并在完成后重置它,以便下一次调用将再次重新开始迭代。如果您确实想这样做,最好的解决方案确实是为特定迭代实现编写一些内容,但这将执行通用迭代:

local iterator

--table.pack is planned for 5.2
local pack = table.pack or function(...)
local t = {...}
t.n = select('#',...)
return t
end

--in 5.1 unpack isn't in table
local unpack = table.unpack or unpack

function metamethods.__call(...)
if not iterator then
iterator = newobject:iterator()
end

local returns = pack(iterator(...))

if returns[1] == nil then
--iteration is finished: next call will restart iteration
iterator = nil
end
return unpack(returns, 1, returns.n)
end

再次强调:这确实应该进行调整以适合您的用例。

关于iterator - 有没有一些聪明的方法来编写 lua 对象,使其兼作迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6113475/

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