JSの文字列のiterator消費挙動テスト
from takker99/ScrapVim
JSの文字列のiterator消費挙動テスト
iteratorを継続して使えるか試す
code:js
{
function* split(str) {
for (const i of str) {
if (i === "<") {
let stack = i;
for (const j of str) {
stack += j;
if (j === ">") {
yield stack;
break;
}
}
continue;
}
yield i;
}
}
console.log(...split("gjj<C-j><C-k>ff"));
}
結果
$ 'g', 'j', 'j', '<gjj<C-j>', 'C', '-', 'j', '>', '<gjj<C-j>', 'C', '-', 'k', '>', 'f', 'f'
やはり、iteratorを継続して使えないようだ
新しいfor loopが始まるたびに、iteratorが再生成される
継続して使いたいときはSymbol.iteratorにアクセスする
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/@@iterator#イテレーターを手動で手繰る
code:2.js
{
function* split(str) {
const iter = strSymbol.iterator();
for (const i of iter) {
if (i === "<") {
let stack = i;
for (const j of iter) {
stack += j;
if (j === ">") {
yield stack;
break;
}
}
continue;
}
yield i;
}
}
console.log(...split("gjj<C-j><C-k>ff"));
}
$ 'g', 'j', 'j', '<C-j>', '<C-k>', 'f', 'f'
うまくいった
#2023-11-06 15:57:18