如何在Julia中实现迭代器?

时间:2014-07-30 03:58:48

标签: julia

我正在尝试在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

知道我做错了吗?

2 个答案:

答案 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