julia迭代:开始,接下来,完成副作用

Iss*_* T. 4 julia

迭代中朱莉娅可以为新定义的类型通过实施具有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包中的一些迭代器而不尊重它.

Ken*_*her 7

如果可能,那些函数不应该改变迭代器(这样可以复制和重用迭代器状态).但是,有一些突出的例子表明这种设计是不可能的,或者只有在显着的性能损失下才有可能.这个例子的主要例子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)

在那些情况下,我们通常一直没有变异(虽然当然任何使用缓存协议的缓存状态都不会起作用).函数末尾的感叹号是一个约定,但不以任何方式强制执行(并不严格限制其输入参数的变异,而是具有一些副作用,您希望确保程序员知道) .