【问题标题】:How to implement an iterator in Julia?如何在 Julia 中实现迭代器?
【发布时间】:2014-07-30 03:58:48
【问题描述】:

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

RDF 模块中的函数定义现在是这样的:

function start(graph::Graph)
    return GraphIterator(collect(keys(graph.statements)), nothing, nothing, nothing, [], [])
end

知道我做错了什么吗?

【问题讨论】:

    标签: julia


    【解决方案1】:

    不要忘记指定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。

    【讨论】:

    • 啊。添加“基地”。 startdonenext 做到了。我将需要再次研究范围界定。非常感谢!
    • 如果你不想在你定义的每个方法前面加上Base.前缀,你可以通过模块顶部的import Base: start, done next显式导入它。
    【解决方案2】:

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

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

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

    实际上,这意味着在 x::YourType 上迭代

    for i in x
        # some code
    end
    

    是写作的简写

    it = iterate(x)
    while it !== nothing
        i, state = it
        # some code
        it = iterate(x, state)
    end
    

    详情请参阅manual

    【讨论】:

      猜你喜欢
      • 2016-05-10
      • 2016-01-23
      • 2020-10-02
      • 1970-01-01
      • 2018-03-07
      • 2017-08-05
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      相关资源
      最近更新 更多