çŸä»£çJavaScriptããããã¢ããã³ãã«ã¬ã³ããŒ2017 â 23æ¥ç®
æŠèŠ
function*
ã§ãã€ãã¬ãŒã¿ãè¿ããžã§ãã¬ãŒã¿é¢æ°ãäœæã§ããŸããäžã§ yield
ã䜿ããŸãã
function* createIdGenerator() {
let currentId = 100;
while (true) {
yield currentId++;
}
}
const iterator = createIdGenerator();
console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
ããã¯ãªããžã§ã¯ããå埩å¯èœã«ããã®ã«äŸ¿å©ã§ãã
const obj = {
*[Symbol.iterator]() {
const max = 3;
for (let i = 0; i < max; i++) {
yield i;
}
}
};
for (let item of obj) {
console.log(item);
}
ã€ãã¬ãŒã¿
èåãªãã¶ã€ã³ãã¿ãŒã³ã®ã²ãšã€ã§ããé
åã§ãªããªããžã§ã¯ãã§ããå
±éã®ã€ã³ã¿ãŒãã§ã€ã¹ã§å埩åŠçãè¡ããããã«ããŸãã
JavaScript (ES2015+) ã§ã¯ïŒãã¶ãäžè¬çãªå®çŸ©ãšã¯ç°ãªãïŒã€ãã¬ãŒã¿ã¯ next()
ã¡ãœãããæã€ãªããžã§ã¯ãã§ããå
·äœçãªã€ã³ã¿ãŒãã§ã€ã¹ã¯åŸè¿°ããŸãã
JavaScriptã§ã®ã€ãã¬ãŒã¿
ã€ãã©ãã«ãªãªããžã§ã¯ãã§ [Symbol.iterator]()
ãšãããããååã®ã¡ãœãããå®è¡ãããšãã€ãã¬ãŒã¿ãåŸãããŸãã
const iterable = new Set([100, 200, 300]);
// ã€ãã¬ãŒã¿çæ
const it = iterable[Symbol.iterator]();
while (true) {
// å埩åŠçãé²ããçŸæ®µéã®ç¶æ
ãåŸã
const result = it.next();
// ç¹°ãè¿ãæ¡ä»¶ã確èª
if (result.done) {
break;
}
// é
ç®ååŸ
const item = result.value;
console.log(item);
}
Set
ãªããžã§ã¯ãã¯ã€ãã©ãã«ãªãªããžã§ã¯ããªã®ã§ã [Symbol.iterator]()
ãå®è¡ãããšã€ãã¬ãŒã¿ it
ãçæããŠè¿ããŠãããŸãã
ãã®ã€ãã¬ãŒã¿ it
㯠next()
ã¡ãœãããæã¡ãŸãããã®ã¡ãœããåŒã³åºããç¹°ãè¿ããŠå埩 (iterate) ããŠãããŸãã
next()
ã¡ãœããã¯å®è¡ãããã³ã«ããªãã ããçµæãªããžã§ã¯ãïŒ result
ãçæããŠè¿ããŸããçµæãªããžã§ã¯ãã£ãŠåŒã³æ¹ã§è¯ãããªã IteratorResult
ãšããååã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒåŸè¿°ïŒãæºãããªããžã§ã¯ãã§ãã
ãã®çµæãªããžã§ã¯ãã¯ãŸããäºã€ã®ããããã£ãæã¡ãŸãã value
ãå埩éäžã®çŸæ®µéã®å€ã§ã done
ãããå埩ãçµããããæ ŒçŽãããçåœå€ã§ãã
ãããã䜿ã£ãŠé
åã§ãäœã§ãããããã§ããŸãã
for-of
ã§äœ¿ã
ãªããžã§ã¯ããã€ãã©ãã«ã§ãããã€ãŸãåè¿°ã®åèŠçŽ ãæºããå Žåã for-of
ã䜿ã£ãŠç°¡åã«å埩åŠçãå®çŸã§ããŸãã
const iterable = new Set([100, 200, 300]);
for (let item of iterable) {
console.log(item);
}
ããçãã
ãžã§ãã¬ãŒã¿ã§çæãã
[Symbol.iterator]()
ãã¡ãããšèªäœããã°ã©ããªãªããžã§ã¯ãã§ãã€ãã©ãã«ã«ã§ããŸãã
next()
ã¡ãœãããèªåã§å®è£
ããŠãè¯ããã ãã©ãé¢åãªã®ã§ããžã§ãã¬ãŒã¿é¢æ°ãšããã®ã䜿ã£ãŠäœããšç°¡åã§ãã
ãžã§ãã¬ãŒã¿
function*
ã䜿ã£ãŠãžã§ãã¬ãŒã¿é¢æ°ã宣èšã§ããŸãããžã§ãã¬ãŒã¿é¢æ°ãå®è¡ãããšãžã§ãã¬ãŒã¿ãªããžã§ã¯ããåŸãããŸãã
function* createGenerator() {
const values = [100, 200, 300];
for (let i = 0; i < values.length; i++) {
const item = values[i];
yield item;
}
}
const generator = createGenerator();
ãžã§ãã¬ãŒã¿ãªããžã§ã¯ãã¯å ããŠã€ãã©ãã«ã§ãããã§ for-of
ã§äœ¿ããŸããããŒãã
for (let item of generator) {
console.log(item);
}
generator[Symbol.iterator]()
ã®çµæã¯å
ã®ãªããžã§ã¯ã generator
ã«ãªããŸãã
ãŸãåæã«ã€ãã¬ãŒã¿ã§ãããã®ã§ next()
ãæã¡ãŸããã³ãŒãã¯æžããªããŠãè¯ãããã
yield
ããã£ãšäœ¿ã£ããã©ããžã§ãã¬ãŒã¿é¢æ°ã®äžã§ã¯ yield
ãšããåŒã䜿ããŸãããã®åŒã¯å³èŸºã value
ããŸã done: false
ãšããèšå®ã§ã next()
ã§è¿ã IteratorResult
ãªããžã§ã¯ããçæããŸãã
å¿
ããã for
æã§äœ¿ãå¿
èŠã¯ãªãã§ãã
function* oneTwoThree() {
yield 1;
yield 2;
yield 3;
}
const it = oneTwoThree();
let result;
result = it.next();
console.log(result.value); // => 1
result = it.next();
console.log(result.value); // => 2
result = it.next();
console.log(result.value); // => 3
[Symbol.iterator]()
ãå®è£
ãã
ãããã [Symbol.iterator]()
ã§ãã *
ãä»ããŠããžã§ãã¬ãŒã¿é¢æ°ãšããããžã§ãã¬ãŒã¿ã¡ãœããã«ãªããŸãã
const obj = {
*[Symbol.iterator]() {
const max = 3;
for (let i = 0; i < max; i++) {
yield i;
}
}
};
for (let item of obj) {
console.log(item);
}
ä»ã®ã€ãã¬ãŒã¿çæã¡ãœãããäœã
obj
ãããªã㊠obj.iterator()
ã®ããã«ã¡ãœãããåŒãã§ããå¿
èŠãããããã©ãä»ã®ååã§ã倧äžå€«ã
ç®çå¥ã«äœéããçšæããŠãè¯ããããã
const obj = {
*iterator() {
const max = 3;
for (let i = 0; i < max; i++) {
yield i;
}
}
};
for (let item of obj.iterator()) {
console.log(item);
}
ã€ãã¬ãŒã¿ã®ã€ã³ã¿ãŒãã§ã€ã¹
ãã£ã±ãåºãŠããã®ã§ãŸãšãã
- å埩å¯èœ(ãªãªããžã§ã¯ã …
[Symbol.iterator]()
ããã€ãªããžã§ã¯ãïŒ Iterable
ïŒ
[Symbol.iterator]()
… ã€ãã¬ãŒã¿ãè¿ãã¡ãœãã
- ã€ãã¬ãŒã¿ …
next()
ããã€ãªããžã§ã¯ãïŒ Iterator
ïŒ
next()
… value
ã done
ãæã€ãªããžã§ã¯ãïŒ IteratorResult
ïŒãè¿ããå
éšç¶æ
ãé²ããã¡ãœãã
value
… å埩åŠçåæ®µéã«ãããå€
done
… å埩åŠçãçµäºããŠãããã©ãã
[Symbol.iterator]()
Symbol.iterator
ãšããã·ã³ãã«ããååãšãããäœã ããèå¥åïŒã«ãªã£ãŠãã¡ãœããã§ãã []
ã¯åçã«ããããã£åãæ±ºãããã€ã§ããå¥çš¿åç
§ãããšã·ã³ãã« Symbol
ã«ã€ããŠãã
ãªããªãã©ããã§ Symbol.iterator = 'iterate'
ãšãå®çŸ©ãããŠããšèããŠãã ããã
Iterable
ã€ã³ã¿ãŒãã§ã€ã¹
ãªããžã§ã¯ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæºãããŠãããšã for-of
ãšã ...
ãšãã䜿ããŸãã
[Symbol.iterator]()
… ã€ãã¬ãŒã¿ãªããžã§ã¯ããè¿ã
Iterator
ã€ã³ã¿ãŒãã§ã€ã¹
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãæºãããªããžã§ã¯ããã€ãã¬ãŒã¿ãªããžã§ã¯ããšåŒã³ãŸãã
next()
… ã€ãã¬ãŒã¿ãªããžã§ã¯ããè¿ã
return()
(optional) … ã€ãã¬ãŒã¿ãªããžã§ã¯ããè¿ã
throw()
(optional) … ã€ãã¬ãŒã¿ãªããžã§ã¯ããè¿ã
return()
ãåŒã³åºããšãããçµäºãããããšã throw()
ãåŒã³åºããšããªããããããããããåŒã³åºãå
ãšãªããªããžã§ã¯ãã«äŒããããšããã§ããããããã§ããåçŽã«é
åã¿ãããªæ
å ±ãæ±ãäžã§ã¯ãããªãããã ãã©ãäœãå€éšããæ
å ±ãåŒã£åŒµã£ãŠãããããªãã€ã§äœ¿ããšãã«äŸ¿å©ãªãã ãããããããªãã
IteratorResult
ã€ã³ã¿ãŒãã§ã€ã¹
next()
ä»ã®ã¡ãœããã¯ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãæºãããªããžã§ã¯ããè¿ãå¿
èŠããããŸãã
åå²ä»£å
¥ãã¹ãã¬ããæŒç®å ...
ãããå®ã¯ã€ãã©ãã«ãªããžã§ã¯ãã察象ã§ããé
åãããªããŠãèªäœã®ãªããžã§ã¯ãã§ãã [Symbol.iterator]()
ãåããŠããã°äœ¿ããŸãã
function* oneTwoThree() {
yield 1;
yield 2;
yield 3;
}
// åå²ä»£å
¥
const [one, two, three] = oneTwoThree();
console.log(one);
console.log(two);
console.log(three);
// ã¹ãã¬ããæŒç®å
function say(one, two, three) {
console.log(one);
console.log(two);
console.log(three);
}
say(...oneTwoThree());
ES2018ã§ã¯æ®éã®ãªããžã§ã¯ããåå²ä»£å
¥ãããã¹ãã¬ããæŒç®åã§å±éãããã§ããããã«ãªãã£ãœããã ãã©ããããæ®éã®ãªããžã§ã¯ããå
šéšã€ãã©ãã«ã«ãªãã®ããªïŒã仿§çå®ã®æ§åã¯è¿œã£ãŠãªãã®ã§æã£ãã ãã ãã©ã
åå²ä»£å
¥ãš ...
ã®äœ¿ãæ¹ã¯å¥çš¿åç
§ã
ãã®ä»
[Symbol.iterator]()
ãŠäœã ã
ãªãã§æ®éã®ååãããªããã Symbol
ãªãã ã toString()
ã¿ããã«ããªãã£ããã ã
ã ãããã€ãã¬ãŒã¿ã¯ã€ãã©ãã«
ãã€ãã¬ãŒã¿ããšãã€ãã©ãã«ãã¯å¥ã€ã³ã¿ãŒãã§ã€ã¹ãªã®ã§åæã«æºããå¿
èŠã¯ãªããã ãã©ãå
éšã§ %IteratorPrototype%
ãšããã€ãã¬ãŒã¿å
±éã®ãããã¿ã€ãããããŸããŠãããã€ãã€ãã©ãã«ã ã£ããããŸãã
é
åãšãã®ã€ãã¬ãŒã¿ã¯ãã®ãããã¿ã€ããç¶æ¿ããŠããã®ã§ãJavaScriptãã€ãã£ããªã€ãã¬ãŒã¿ã¯ã ãããã€ãã©ãã«ã«ãªãã£ãœãã TypedArray
ã¯å°çšã®ãã®ãæããªãããæ®éã®é
å Array
ã®åŠçãå©çšããŠããã
ã¡ãªã¿ã« %IteratorPrototype%
ã® [Symbol.iterator]()
㯠this
ãè¿ããŸãã
ã€ãã©ãã«ã§ã¯ãªãã€ãã¬ãŒã¿
ã®äŸã
class MyIterator {
constructor(values) {
this.values = values;
this.index = 0;
}
// èªåã§å®è£
ããã
next() {
const value = this.values[this.index];
this.index += 1;
return {
value: value,
done: this.index >= this.values.length,
};
}
};
const values = [100, 200, 300];
// ã€ãã¬ãŒã¿ãšããŠå©çš
const it = new MyIterator(values);
let result;
result = it.next();
console.log(result.value);
// ã€ãã©ãã«ãšããŠå©çšïŒã§ããªãïŒ
// Exception: TypeError: (new MyIterator(...)) is not iterable
for (let item of new MyIterator(values)) {
console.log(item);
}
æ®éã®ã€ãã¬ãŒã¿
Javaæ¹é¢ã®è©±ã§èãããšã㯠next()
ã§æ¬¡ã«ç§»åãã€ã€å€ãæ»ãå€ã§ãã®ãŸãŸåŸãŠãç¶ãããããã©ãã㯠hasNext()
ãšããå¥ã®ã¡ãœããã䜿ãã¿ãããªæµãã ã£ããšæããã ãã©ããªãã§éãã®ããããã
æä»£ãå€ãã£ãŠã€ãã¬ãŒã¿ãã¿ãŒã³èªäœãå€ãã£ãïŒ
ã€ã³ã¿ãŒãã§ã€ã¹ vs ãããã³ã«
ã¡ãªã¿ã«MDNã ãšã€ãã¬ãŒã¿ãšãã§ããããã³ã« (protocol)ããšãã衚çŸãçšããããŠããããã©ã仿§æžã ãšãã€ã³ã¿ãŒãã§ã€ã¹ (interface)ãã§ãããŸãåããã®ã§ããã
ãããSwiftã¯protocolãšãã衚çŸããŠãããã
function
ãš *
ã®éã§æ¹è¡ã§ãã
é©åœã«ç©ºçœæåã眮ããæ§åã
async
ã¯ã ãã ã£ãã®ã«ïœã
åè
æŽæ°å±¥æŽ
- 2017/12/23
TypedArray
ãã€ãã©ãã«ãããªãã¿ãããªåéãããŠãã®ãä¿®æ£