新的可迭代型別
在 Julia 中,當迴圈遍歷可迭代物件時,使用 for
語法完成 I
:
for i = I # or "for i in I"
# body
end
在幕後,這被翻譯為:
state = start(I)
while !done(I, state)
(i, state) = next(I, state)
# body
end
因此,如果你希望 I
是可迭代的,則需要為其型別定義 start
,next
和 done
方法。假設你將包含陣列的型別 Foo
定義為以下欄位之一:
type Foo
bar::Array{Int,1}
end
我們通過執行以下操作來例項化 Foo
物件:
julia> I = Foo([1,2,3])
Foo([1,2,3])
julia> I.bar
3-element Array{Int64,1}:
1
2
3
如果我們想迭代 Foo
,每次迭代返回每個元素 bar
,我們定義方法:
import Base: start, next, done
start(I::Foo) = 1
next(I::Foo, state) = (I.bar[state], state+1)
function done(I::Foo, state)
if state == length(I.bar)
return true
end
return false
end
請注意,由於這些函式屬於 Base
模組,因此在向其新增新方法之前,我們必須先知道它們的名稱。
定義方法後,Foo
與迭代器介面相容:
julia> for i in I
println(i)
end
1
2
3