迭代中朱莉娅可以为新定义的类型通过实施具有3个功能迭代接口来实现:start,next,done
我看到这些函数的末尾没有惊叹号,所以根据我对julia命名约定的理解,这3个函数不应该修改它们的参数.特别是这两个循环应该给出相同的输出
state = start(iter)
while !done(iter, state)
(i, state) = next(iter, state)
@show i
end
state = start(iter)
while !done(iter, state)
(other_i, other_state) = next(iter, state)
(i, state) = next(iter, state)
@show i
end
Run Code Online (Sandbox Code Playgroud)
我错了吗?我问,因为我碰到了外部julia包中的一些迭代器而不尊重它.
如果可能,那些函数不应该改变迭代器(这样可以复制和重用迭代器状态).但是,有一些突出的例子表明这种设计是不可能的,或者只有在显着的性能损失下才有可能.这个例子的主要例子Base.Task是可迭代的(每次迭代运行到下一个produce语句):
julia> collect(@async for i = 1:10
produce(i)
end)
10-element Array{Int64,1}:
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
在那些情况下,我们通常一直没有变异(虽然当然任何使用缓存协议的缓存状态都不会起作用).函数末尾的感叹号是一个约定,但不以任何方式强制执行(并不严格限制其输入参数的变异,而是具有一些副作用,您希望确保程序员知道) .