Pull to refresh

Comments 11

Мне кажется, слова «ленивый» и «LINQ» в заголовке сделали бы намного яснее суть поста.
Добавил "(ленивые)" в хедлайн.
Просветите пожалуйста, какое практическое применение всего этого (желательно на простом примере). Спасибо.
Такой логический Range можно пихать в алгоритмы, заточенные на приём обычного Range (например массива). В случае с логическим Range нам не нужна память для хранения исходного массива, плюс он может быть бесконечным.

Бесконечность: например бесконечный range задаёт карту высот для некоторой двумерной поверхности в игре, мы можем промотать карту на сколько угодно вправо и влево и отрисовать поверхность, с минимальным расходом памяти.
Ага, вроде дошло. Но при этом нам же придется каждый раз вычислять значение нового элемента. И чем сложнее функция, тем больше это будет влиять на производительность. Или нет?
Ничем, это так называемый «синтаксический сахар». Повышается читаемость кода.
Ну плюс еще можно «закэшировать» часть данных «последовательности» (если напишите соответствующую реализацию).
Да, придётся. Но иногда это не критично, а ингда и вовсе не важно.
Не важно, когда исходный массив требуется ровно один раз, например нам нужен массив содержащий квадраты всех чисел от 1 до 5, мы можем записать:

var arr1 = new Array();

for( var i = 1; i <= 5; ++i )
{
arr[i-1] = i*i;
}

// или

var arr2 = Stream.range( 1, 5 ).map( function ( x ) { return x * x } );

// выше, правда, создаётся объект типа range (если я правильно понял)
// но наверное есть способ просто сконвертировать его в массив.


Плюсы такого подхода, как правильно написал smashercosmo: синтаксический сахар и возможность подсунуть свою последовательность алгоритмам, которые принимают на вход массивы.
Думаю хорошим примером использования бесконечных массивов был бы список простых чисел генерируемый динамически на основе решета Эратосфена. Либа такое позволяет?
Sign up to leave a comment.

Articles