julia迭代:开始,下一步,完成副作用

julia迭代:开始,下一步,完成副作用,julia,Julia,Julia中的迭代可以通过实现迭代接口来实现,该接口具有3个功能:开始,下一步,完成 我在这些函数的末尾没有看到感叹号,因此根据我对julia命名约定的理解,这3个函数不应该修改它们的参数。特别是,这两个循环应提供相同的输出 state = start(iter) while !done(iter, state) (i, state) = next(iter, state) @show i end state = start(iter) while !done(iter, s

Julia中的迭代可以通过实现迭代接口来实现,该接口具有3个功能:
开始
下一步
完成

我在这些函数的末尾没有看到感叹号,因此根据我对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

我错了吗?我问这个问题是因为我在外部julia包中遇到了一些迭代器,它们不尊重这一点。

这些方法应该修改它们的参数,可能是因为您可能想重复使用迭代器,并且您对感叹号的看法是正确的

你是对的,习惯是附加

我还遇到了一个包,这个包使用了下面的方法!()并且这个确实改变了你的进度表类型

我喜欢感叹号的想法(我不知道它是否起源于Julia或其他地方),但对于开发人员来说,与此保持一致肯定很重要

tl;dr 你是对的,文档中是这样说的,为了真正巩固这一点,我们称之为详细说明这一点的部分


(对于非英语母语人士,请注意,没有感叹号)

如果可能,这些函数不应改变迭代器(以便可以复制和重复使用迭代器状态)。然而,有一些突出的例子表明,这样的设计是不可能的,或者只有在性能受到严重影响的情况下才可能实现。这方面的主要示例是
Base.Task
,它是可执行的(每次迭代运行到下一个
product
语句):


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

您的意思是必须以关于的格式显式编写循环吗?或者下一步是关于语句方面的
?我怀疑这一点!我不明白你在说什么?您指的是ProgressMeter软件包吗?或者别的什么我承认我没看过包裹;但是,
next()
函数是由
for
语句内部使用的,对吗?下一步如何定义
for
语句中使用迭代器的代码>函数帮助?
for
语句是否查找下一个
!()
是否也有功能?还是我误解了你的意思?啊,没关系,它实际上是一个
进度计。下一个函数,只是碰巧有相同的名称,但与
Base.next
或迭代器无关。我认为这只是一个更新进度表以显示下一点的功能。对不起,我以为你的意思是ProgressMeter是一个迭代器,这个函数在for循环中被隐式调用。不,对不起,我说的有点混乱。进入下一个的ProgressMeter对象(类型)!()method本身不是一个interator,而是一个包含一个interator的类型,你可以随意处理它,它有一个结束和一个开始,但它应该是一种制作进度表的简单方法,我只是用它作为下一个包的示例!()方法。for循环不会在ProgressMeter对象上迭代,ProgressMeter对象具有用户预定义的大小。我很抱歉,我给出的例子与我试图表达的内容只有一点关联。总之,迭代器应该是不可变的,因为在迭代过程中更改内容是危险的,所以在迭代器上使用变异函数是没有意义的。至于变异
状态
,我想没有
next
函数可以改变接收到的
状态
对象,并简单地再次返回它,而不仅仅是返回一个新的状态对象,实际上,
状态
对象不应该被直接操作,但是它是
for
语句的内部,就像
next
一样。所以想必是缺少!只是为了保持一致性。你在哪个包裹里发现了“无礼行为”?:p感谢您的澄清@TasosPapastylianou。别担心包装,会修好的。哦,我不是说有什么东西本身需要修好。改变内在的
状态
变量并不是什么大问题(甚至可能是实现迭代器的更有效的方法)。我只是想知道你在哪里看到它,这样我就可以看一看:对于任何使用Julia 1+遇到这个问题的人,迭代器的实现是不同的,请看or,例如这个问题:
Base。Eachline
是另一个基本的变异迭代器示例,在Base中。这是正确的。为了说明一点,一些对象自然支持我们不考虑突变的状态变化;例如,从文件读取会更新文件位置,但我们不使用名称
read用于此。在这些情况下,突变似乎不是一个正确的概念。
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