分配生成器功能时会发生啥? [关闭]

Posted

技术标签:

【中文标题】分配生成器功能时会发生啥? [关闭]【英文标题】:What should happen when a generator function is assigned? [closed]分配生成器功能时会发生什么? [关闭] 【发布时间】:2010-12-09 18:47:16 【问题描述】:

如果我有一种具有一流功能的编程语言。共享生成器函数时的语义应该是什么?

例如:

var f = function()  
  foreach (i in 0..42)
     yield i;


int a = f(); // 0
int b = f(); // 1

// Assigning the generator function 
var g = f;

int c = g(); // ??
int d = f(); // ??

我可以想象三件事:

    c == 2, d == 3 表示生成器函数是共享的 c == 0, d == 2 表示创建了一个新的生成器函数,并初始化了值 c == 2, d == 2 表示通过复制生成器的当前状态来创建新的生成器函数

在我看来,最好的答案是提供最有说服力的论据来执行一种或另一种机制。我经常发现现有技术是最有说服力的论据。

【问题讨论】:

对于奖励积分,不同的线程呢? 不同的线程是一个独立的问题。即使您不分配生成器也会发生这种情况(假设线程可以访问相同的变量)。 【参考方案1】:

如果您的语言中有引用语义,并且赋值通常是引用赋值,那么您需要选项 1。

这就是 Python 中发生的情况,其中生成 are 对象,赋值 is 引用赋值(即使您调用 .next() 来检索下一个值,而不是而不是“调用”生成器)。

这是一个简短的演示,它在 Python 中的行为方式:

>>> def gen():
...   for i in range(42):
...     yield i
... 
>>> f = gen().next
>>> a = f()
>>> b = f()
>>> g = f
>>> c = g()
>>> d = f()
>>> a, b, c, d
(0, 1, 2, 3)

【讨论】:

如果编辑包含一大块代码太多,我很抱歉!我想添加它,但觉得它对于自己的答案来说太少了。 代码对我来说是正确的,所以编辑很好(虽然我发现将 f 设置为绑定的 next 方法太可爱了;我宁愿共享生成器,而不是绑定的方法)。

以上是关于分配生成器功能时会发生啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我已将 Laravel 查询生成器分配给一个变量。使用时会发生变化

当我用尽 bigint 生成的密钥时会发生啥?如何处理?

当我用尽 bigint 生成的密钥时会发生啥?如何处理?

C alloca 函数 - 当试图分配太多内存时会发生啥

当一个对象被分配给另一个对象时会发生啥?

当试图释放堆管理器分配的内存时会发生啥,它分配的比要求的多?