新的可迭代型別

在 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 是可迭代的,則需要為其型別定義 startnextdone 方法。假設你將包含陣列型別 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