如何在Julia中实现迭代器?

Joa*_*him 2 julia

我试图在Julia中实现一个迭代器,但是当for循环尝试调用时会得到异常start.

这是我得到的(我运行include(...),然后using RDF):

julia> methods(start)
# 1 method for generic function "start":
start(graph::Graph) at /Users/jbaran/src/RDF.jl/src/RDF.jl:214

julia> for x in g
       println(x)
       end
ERROR: `start` has no method matching start(::Graph)
 in anonymous at no file
Run Code Online (Sandbox Code Playgroud)

RDF模块中的函数定义目前如下所示:

function start(graph::Graph)
    return GraphIterator(collect(keys(graph.statements)), nothing, nothing, nothing, [], [])
end
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

BoZ*_*haa 11

在 Julia 1.+ 中,您应该实现:

  1. Base.iterate(::YourType)对于起始迭代,
  2. Base.iterate(::YourType, state)state用于后续迭代,同时从前面的步骤中获取。

两种方法都应该返回(result, state)元组,除了最后一个迭代应该返回nothing

在实践中,这意味着x::YourType迭代

for i in x
    # some code
end
Run Code Online (Sandbox Code Playgroud)

是写作的简写

it = iterate(x)
while it !== nothing
    i, state = it
    # some code
    it = iterate(x, state)
end
Run Code Online (Sandbox Code Playgroud)

详细信息请参阅手册


Iai*_*ing 6

不要忘记指定Base.- 您正在向现有函数添加方法.

module MyMod
  type Blah
    data
  end
  export Blah
  Base.start(b::Blah) = 1
  Base.done(b::Blah,state) = length(b.data) == state-1
  Base.next(b::Blah,state) = b.data[state], state+1
end
using MyMod
x = Blah([1,2,3])
for i in x
  println(i)
end
Run Code Online (Sandbox Code Playgroud)

这适用于Julia 0.3.