新的可迭代类型

在 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