通过学习aardio基础语法,我们知道在调用一个对象的成员函数时 - 函数默认会提供owner参数指向他所在的集合。
所以如果我们把上面的 each( array ) = function(){} 函数修改为 arr.each = function(){} 以后,就可以在迭代器内部使用owner对象来访问集合对象了。
我们想当然的把上一节的代码修改如下:
import console;
var arr = {1;23;45};
arr.each = function(){
var i = 0;
return function(){
i++;
if( owner[ i ] ) return owner[ i ];
}
}
for n in arr.each() {
console.log("n",n)
}
console.pause(true);
可是运行后,代码报错了,说是 onwer参数为null,出错行为上面红字标出的那行。
我们知道每个函数都有自己的owner参数,arr.each函数内部的owner参数无疑就是指向arr对象。 但在 arr.each 内部创建的新函数( 也就是那个迭代器 )并不是任何集合对象的成员,他的owner对象是空的。
这该如何是好呢?! 幸运的是 - aardio中提供了一种机制,for语句可以在接受迭代器生成器的多个返回值,你可以用第一个返回值返回迭代器,你可以用第二个返回值返回迭代器的owner对象,正确的代码如下: import console;
var arr = {1;23;45};
arr.each = function(){
var i = 0;
return function(){
i++;
if( owner[ i ] ) return owner[ i ];
},owner //使用第二个返回值显式指定迭代器的owner参数
}
for n in arr.each() {
console.log("n",n)
}
console.pause(true);
如果上面的代码让你困惑,这也没关系,只要不使用owner这个特殊的名字,你完全可以简单而粗暴的把代码写成下面这样: import console;
var arr = {1;23;45};
arr.each = function(){
var i = 0;
var 集合对象 = owner;
return function(){
i++;
if( 集合对象[ i ] ) return 集合对象[ i ];
}
}
for n in arr.each() {
console.log("n",n)
}
console.pause(true);
|