Дополнительным плюсом будет тот факт, что у нас появляются другие возможности итераторов. Например, можно очень просто преобразовать наш range в массив:Преобразование в массив это не эксклюзивная фишка генераторов.
Ничто не мешает преобразовать в массив и итератор из второго примера:
function range(from, to, step = 1){
return {
[Symbol.iterator](){
return {
current: from,
to: to,
from: from,
step,
next(){
const it = { done: this.current >= this.to, value: this.current }
this.current += this.step
return it
}
}
}
}
}
console.log([...range(0, 10)])
Последний пример можно ещё упростить и просто объявить генератор. Вместо
function range(from, to, step = 1){
return {
*[Symbol.iterator](){
for(let val = from; val < to; val += step){
yield val;
}
}
}
}
можноfunction* range(from, to, step = 1){
for(let val = from; val < to; val += step){
yield val;
}
}
Да. Возможно я неправильно выразился, но я вовсе не хотел указывать, что это особенность генераторов.
Спасибо, что указали на последний пример. Кажется я слишком увлекся символами и совсем не подумал об очевидном применении генератора.
function* range(from, to, step = 1) {
while (from < to) {
yield from;
from += step;
}
}
И да, ладно, что нет проверок, что входные данные — это числа. Тут будут проблемы с отрицательным
step
ещё.Надо бы проверить, что все параметры являются числами. Или преобразовать их в числа при помощи унарного плюса.
Потому что со строками функция range работает совершенно логичным, но не соответствующим своему названию образом.
А на Бабеле написать квадратные скобочки с поддержкой двоеточий внутри слабо?
Тем не менее, хотел бы отметить, что синтаксис [1..10] в JS невалиден, поскольку выкинет SyntaxError: Unexpected number из-за того, что это по сути попытка получить атрибут «10» числа «1.» — на это может намекнуть строка «15..toString(2)»
[1..10]
, но и arr[:2]
. Вообще, меня удручает, что бабеля так мало в реальных проектах, ну вот я бы, например, обрадовался оператору |>
для замены функции pipe()
в RxJSДобро пожаловать в 2020, что pipe operator
, что range
уже есть в пропозалах https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80
Он там уже почти пять лет в пропозалах, из них почти 3 года в stage 1.
Шикарно! Буду отслеживать! А пробные реализации видели?
https://babeljs.io/docs/en/babel-plugin-proposal-pipeline-operator есть как раз таки плагин бабеля
Только учтите, что перейдя на TypeScript вы начнёте его судорожно отовсюду выпиливать. Т.е. оно полностью ломает его, даже при выводе типов из js-файлов.
for i in range(1, 10):
print(i)
range_iter = range(1, 10).__iter__()
while True:
try:
value = range_iter.__next__()
print(value)
except StopIteration:
break
Змеиный сахар или пишем свой range в JavaScript