ColdFusion では、イテレーターは、シーケンスと終了時の戻り値を定義するオブジェクトです。Iterator プロトコルは、すべての値が生成されたときに、値のシーケンス (有限または無限) を生成するための標準的な方法を定義します。また、場合によっては戻り値にもなります。
ColdFusion コンポーネントは反復可能にすることができ、UDF をイテレーターとして使用します。
CFC を反復可能にする方法
CFC が引数なしで __iter__ 関数を実装している場合は、この関数を呼び出してイテレーターインスタンスを取得します。反復可能な関数は、配列、文字列、クエリ、(以下のような)関数を返すことができます。また、__next()__ という関数を持つ CFC も返すことができます。
イテレーターとしての CFC
// Iterator.cfc
component {
public any function __next__(previous, count){ // Follows Iteration Protocol as UDF
return {value: count+1, done: count > 11};
}
}
# cfcAsIterator.cfc
component {
public any function __iter__() {
return new Iterator();
}
}
// stringAsIterator.cfc
component{
public any function __iter__() {
str1="ColdFusion 2021";
str2="Project Stratus";
return [...str1,...str2];
}
}
イテレーターとしての UDF
// udfAsIterator.cfc
//Example using UDF as Iterator and CFC is the Iterable
component {
public any function __iter__() {
var startFrom = 100;
return function(previous, index){//Iterator UDF
return {"value": startFrom + index, "done": index > 9};
}
}
}
// udfAsIterator.cfm
<cfscript>
/*
Plain UDF/Closure/Lambda as Iterator
Invoking iterators using forin loop
*/
iterator = (previous, count) =>{
return {"value": count + 2, "done": count > 9};
};
writeoutput("----------- UDF/Closure/Lambda as Iterator -------------<hr>")
for(i in iterator) {
writeoutput(i & " " & "<br>");
}
udfIteratorOBj = new udfAsIterator();
stringIteratorObj= new stringAsIterator();
cfcIteratorObj = new cfcAsIterator();
writeoutput("<br>----------- UDF as Iterator -------------<hr>")
for(i in udfIteratorOBj) {
writeoutput(SerializeJson(i) & "<br>");
}
writeoutput("<br>----------- String as Iterator -------------<hr>")
for(i in stringIteratorObj) {
writeoutput(SerializeJson(i) & "<br>");
}
writeoutput("<br>----------- CFC as Iterator -------------<hr>")
for(i in cfcIteratorObj ) {
writeoutput(SerializeJson(i) & "<br>");
}
</cfscript>
出力
----------- UDF/Closure/Lambda as Iterator -------------
3 4 5 6 7 8 9 10 11 12
----------- UDF as Iterator -------------
101.0102.0103.0104.0105.0106.0107.0108.0109.0110.0
----------- String as Iterator -------------
"C""o""l""d""F""u""s""i""o""n"" ""2""0""2""1""P""r""o""j""e""c""t"" ""S""t""r""a""t""u""s"
----------- CFC as Iterator -------------
2.03.04.05.06.07.08.09.010.011.012.013.0
イテレーターとしての配列
// arrayAsIteratorwithSpread.cfc
component{
public any function __iter__() {
arr1=[1,2,3]
arr2=[4,5,6]
return [...arr1,...arr2];
}
function demofunc(){
return "demostring!"
}
}
// arrayAsIterator.cfm
<cfscript>
arrayIteratorObj1= new arrayAsIteratorwithSpread();
writeoutput("<br>----------- Array as Iterator 1-------------<hr>")
for(i in arrayIteratorObj1 ) {
writeoutput(i & "<br>");
}
</cfscript>
出力
123456