..... PARHAILLAAN PÄIVITYKSEN KOURISSA .....
Iteraattorit ja generaattorit liittyvät tietojoukkojen käsittelyyn. Iteraattorilla tarkoitetaan "abstraktia sormea", joka osaa osoittaa tietojoukon kaikki alkiot yksi kerrallaan. Generaattori nimensä mukaan generoi tietoalkioiden jonon.
Jo aiemmin on tutustuttu muutamiin tapohin käydä läpi rakenteen arvoja: for, for-in, for-each-in, for-of, forEach, map, "taulukkokomprehensiot", ...
ECMAScriptin 6. versioon on lisätty suuri joukko entistä kehittyneempiä ja monipuolisempia tapoja ohjelmoida iteraattoreita ja generaattoreita. Niistä ei tällä kurssilla käsitellä kuin for-of-lause. Kurssin luonnehdintakin jo mainitsee luennoista että ne "eivät edes pyri olemaan kattavia". Niitä ei siis myöskään ns. "tule kokeeseen"! ;-)
Jos iteraattoreita ja/tai generaattoreita aikoo käyttää laajemmin todellisessa ohjelmistotuotannossa, kannattaa perehtyä uutuuksiin – ja varmistaa samalla, että ne ovat käytettävissä järjestelmässä, johon sovellus on tarkoitettu. Tämän luvun tarkoitus on perusideoiden esittely.
var t = {a:1,b:2,c:3,d:4, e: function() {}} var it = Iterator(t) try {while (true) write(it.next()) } catch(e) {}Tulostus:
a,1 b,2 c,3 d,4 e,function () {}
var t = {a:1,b:2,c:3,d:4, e: function() {}} Object.defineProperty(t, 'e', {enumerable: false }) var it = Iterator(t)Nyt kenttä e ei enää kuulu iteroitaviin assosiaatioihin.
var t = {a:1,b:2,c:3,d:4, e: function() {}} Object.defineProperty(t, 'e', {enumerable: false }) var it = Iterator(t) for (var kentta in it) write(kentta)Tulostus:
a,1 b,2 c,3 d,4
var it = Iterator(t, true) for (var kentta in it) write(kentta)Tulostus:
a b c d
var t = [22,44,32] t.kentta = "kissantassu" var it = Iterator(t) for (var kentta in it) write(kentta)Tulostus:
0,22 1,44 2,32 kentta,kissantassu
var t = {a:1,b:2,c:3,d:4, e: function() {}} var it = Iterator(t) for (var [avain, arvo] in it) write(avain + " --> " + arvo)Tulostus:
a --> 1 b --> 2 c --> 3 d --> 4 e --> function () {}
for (let [avain, arvo] in it) write(avain + " --> " + arvo)Tällöin ympäröivän näkyvyysalueen mahdolliset saman nimiset muuttujat eivät vahingossa pääse muuttumaan. Kuten kaikki muistavat(?), var-määritellyt muuttujat kuuluvat koko funktion näkyvyysalueeseen, let-määritellyt ovat lohkonsa paikallisia muuttujia.
// Määritellään kokonaislukuväliä esittävä olio: function Range(low, high){ this.low = low; this.high = high; } // Laaditaan iteraattori, joka antaa yksitellen kokonaislukuvälin luvut: function RangeIterator(range){ this.range = range; this.current = this.range.low; } RangeIterator.prototype.next = function(){ if (this.current > this.range.high) throw StopIteration; else return this.current++; } // Asetetaan Range.prototype.__iterator__-kentän // arvoksi funktio, joka palauttaa arvonaan uuden iteraattoriolion: Range.prototype.__iterator__ = function(){ return new RangeIterator(this); }; // Ja eikun hommiin: var range = new Range(3, 7); for (let i in range) write(i); // 3, 4, 5, 6, 7
**************** päivitysraja *****************
function N() { for (let i=0; true; ++i) yield i } var luvut = new N() write(luvut.next()) // 0 write(luvut.next()) // 1 write(luvut.next()) // 2 var toiset = new N() write(toiset.next()) // 0 write(toiset.next()) // 1 write(luvut.next()) // 3
function Fibo() { var luku=1, seuraava=1; while (true) { yield luku var summa=luku+seuraava luku=seuraava seuraava=summa } } var luvut = new Fibo() for (var i=0; i<10; ++i) write(luvut.next()) // 1,1,2,3,5,8,13,21,34,55
function N(yla) { this.yla = yla } N.prototype.__iterator__ = function(yla) {for (let i=0; i<this.yla; ++i) yield i } var luvut = new N(10) for (var i in luvut) write(i) // 1,2,3,4,5,6,7,8,9
function N(yla) { for (let i=0; i<yla; ++i) yield i } var x = new N(10) var y = new N(4) write(x.next()) // 0 write(x.next()) // 1 write(x.next()) // 2 write(y.next()) // 0 write(y.next()) // 1 for (let a in x) write(a) // 3,4,5,6,7,8,9 for (let a in y) write(a) // 2,3
function Range(low, high) { this.low = low; this.high = high; } Range.prototype.__iterator__ = function() { for (var i = this.low; i <= this.high; i++) yield i; } var range = new Range(3, 5); for (var i in range) write(i); // 3 4 5
function Range(low, high) { for (var i = low; i <= high; i++) yield i; } var range = new Range(3, 5); for (var i in range) write(i); // 3 4 5
MDN:n tapaan ohjelmoidessa generaattori osaa aloittaa uudelleen alusta:
function Range(low, high) { this.low = low; this.high = high; } Range.prototype.__iterator__ = function() { for (var i = this.low; i <= this.high; i++) yield i; } var range = new Range(3, 5); for (var i in range) write(i); // 3 4 5 for (var i in range) write(i) // 3 4 5 UUDELLEEN ALUSTA!Minun tavallani ohjelmoiden generaattorin "sormi" jää lopputilaan:
function Range(low, high) { for (var i = low; i <= high; i++) yield i; } var range = new Range(3, 5); for (var i in range) write(i); // 3 4 5 for (var i in range) write(i); //