我试图在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.+ 中,您应该实现:
Base.iterate(::YourType)对于起始迭代,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)
详细信息请参阅手册。
不要忘记指定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.