探讨生成器的几种实现形式

生成器可以看作为程序提供连续输入的流,输入类型通常固定为一种(比如整型),当然也可以是任意多的不同类型,下面探讨几种生成器的实现方法,题目是生成1...N的整形值:

[b]一、大家都会的:[/b]

[code]// 代码

public int seed = 0;

public int generator()
{
++ seed;
return seed;
}

// 使用

10.times { = generator() + " " };

// 结果

1 2 3 4 5 6 7 8 9 10
[/code]

[b]二、基于类实现:[/b]

[code]// 代码

public class Generator
{
public int _seed;
public int next()
{
this._seed = this._seed + 1;
return this._seed;
}
}

public Generator generator = Generator();

// 使用

10.times { = generator.next() + " " };

// 结果

1 2 3 4 5 6 7 8 9 10
[/code]

[b]三、基于对象实现:[/b]

[code]// 代码

public object generator
{
public int _seed;
public int next()
{
this._seed = this._seed + 1;
return this._seed;
}
}

// 使用

10.times { = generator.next() + " " };

// 结果

1 2 3 4 5 6 7 8 9 10
[/code]

[b]四、使用函数闭包:[/b]

[code]// 代码

public function init(int seed)
{
return { ++ seed; return seed };
}

function generator = init(0);

// 使用

10.times { = generator() + " " };

// 结果

1 2 3 4 5 6 7 8 9 10
[/code]

[b]五、使用YIELD:[/b]

[code]// 代码

public int init(int seed)
{
while(true) {
++ seed;
return seed
};
}

function generator = sys::yield(init, [0]);

// 使用

10.times { = generator() + " " };

// 结果

1 2 3 4 5 6 7 8 9 10
[/code]

[b]六、使用CURRY:[/b]

[code]// 代码

public int init(int seed)
{
return seed + __func__.execTimes;
}

function generator = sys::curry(init, [0]);

// 使用

10.times { = generator() + " " };

// 结果

1 2 3 4 5 6 7 8 9 10
[/code]

[b]七、返回不同的类型:[/b]

[code]// 代码

public variant init(string s)
{
return s;
return length(s);
return {|string who| = who, "said:", s, eol};
}

function generator = sys::yield(init, ["hello world"]);

// 使用

= "length \"" + generator() + "\" is " + generator(), eol;
generator()("LYSEE");

// 结果

length "hello world" is 11
LYSEE said: hello world
[/code]

实现生成器确实很有意思,一时兴起就写了了几种实现形式,哪位老大还知道别的形式,不妨补充一下,谢谢了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值