我正在尝试在Julia中实现迭代器,但是当for循环尝试调用start
时会出现异常。
这是我得到的(我运行包括(...),然后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
RDF
模块中的函数定义目前如下所示:
function start(graph::Graph)
return GraphIterator(collect(keys(graph.statements)), nothing, nothing, nothing, [], [])
end
知道我做错了吗?
答案 0 :(得分: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
这适用于Julia 0.3。
答案 1 :(得分:0)
在Julia 1+中,应该通过实现Base.iterate(::YourType)
来获得起始迭代,并通过Base.iterate(::YourType, state)
来实现基于某些state
的其他迭代来实现。完成后,这些方法应返回nothing
,否则返回(result, state)
元组。
使用{p>在x::YourType
上进行迭代
for i in x
# stuff
end
是写作的简写
it = iterate(x)
while it !== nothing
i, state = it
# stuff
it = iterate(x, state)
end
有关详细信息,请参见manual。