浏览 384 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-09-10 关键字: Lysee 编程
生成器可以看作为程序提供连续输入的流,输入类型通常固定为一种(比如整型),当然也可以是任意多的不同类型,下面探讨几种生成器的实现方法,题目是生成1...N的整形值:
一、大家都会的: // 代码
public int seed = 0;
public int generator()
{
++ seed;
return seed;
}
// 使用
10.times { = generator() + " " };
// 结果
1 2 3 4 5 6 7 8 9 10
二、基于类实现: // 代码
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
三、基于对象实现: // 代码
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
四、使用函数闭包: // 代码
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
五、使用YIELD: // 代码
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
六、使用CURRY: // 代码
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
七、返回不同的类型: // 代码
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
实现生成器确实很有意思,一时兴起就写了了几种实现形式,哪位老大还知道别的形式,不妨补充一下,谢谢了! 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |


