生成器可以看作为程序提供连续输入的流,输入类型通常固定为一种(比如整型),当然也可以是任意多的不同类型,下面探讨几种生成器的实现方法,题目是生成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]
实现生成器确实很有意思,一时兴起就写了了几种实现形式,哪位老大还知道别的形式,不妨补充一下,谢谢了!
[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]
实现生成器确实很有意思,一时兴起就写了了几种实现形式,哪位老大还知道别的形式,不妨补充一下,谢谢了!