[英]How to implement an iterator in 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
目前RDF
模塊中的函數定義如下所示:
function start(graph::Graph)
return GraphIterator(collect(keys(graph.statements)), nothing, nothing, nothing, [], [])
end
知道我做錯了什么嗎?
不要忘記指定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。
在 Julia 1+ 中,這應該通過實現Base.iterate(::YourType)
來獲取起始迭代和Base.iterate(::YourType, state)
來實現基於某些state
其他迭代。 這些方法在完成后不應返回nothing
,否則返回(result, state)
元組。
用x::YourType
迭代
for i in x
# stuff
end
那么是 write 的簡寫
it = iterate(x)
while it !== nothing
i, state = it
# stuff
it = iterate(x, state)
end
有關詳細信息,請參閱手冊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.