
Dmitry
06.09.2016
13:39:10
До меня сейчас дошло, что все эти операции я делаю для отдельных файлов. А мне нужно в результате выставить один флаг для целого каталога.

Oleg
06.09.2016
13:40:32

Dmitry
06.09.2016
13:40:41
Какой самый адекватный вариант то выбрать?

Oleg
06.09.2016
13:41:03
создавать копию и popFront из диапазона делать, возвращать копию?

Google

Dmitry
06.09.2016
13:41:51
э.... ни слова не понял) я вообще попами (кроме женских) ни разу не пользовался.

Eto
06.09.2016
13:41:56

Oleg
06.09.2016
13:43:33

Anatoly
06.09.2016
13:43:36
Дмитрий, это не Вам было, скорее всего и ... в итоге вы ещё придёте к асинхронной работе, чтобы у вас там не было слишком всё последовательно. Синтаксис foreach я указал
может даже RxD появится в итоге какой-нибудь =)
а... даже у же есть https://code.dlang.org/packages/rx

Dmitry
06.09.2016
13:45:42
@ttldtor а мне ответ с какого момента то?

Oleg
06.09.2016
13:46:56
https://dlang.org/library/std/range/primitives/move_front.html
Moves the front of r out and returns it. Leaves r.front in a destroyable state that does not allocate any resources (usually equal to its .init value).
Брать front и возвращать. Возвращать r.front в разрушаемое (или всё-таки разрушенное) состояние, которое не требует выделения памяти.

Anatoly
06.09.2016
13:47:06
вариантов много)

Dmitry
06.09.2016
13:47:38
а что-то покрасивее?

Anatoly
06.09.2016
13:47:55
в смысле?

Google

Dmitry
06.09.2016
13:48:13
ну более красивая реализация чем читать кол-во файлов в каталоге

Oleg
06.09.2016
13:48:27
@sigod в любом случае после moveFront значение front должно измениться, судя по этим словам (на .init значение)
@sigod но на обычных массивах так не работает, возвращается раз за разом одно и тоже значение (сброса к .init не происходит)

Dmitry
06.09.2016
13:50:36
dirEntries если не ошибаюсь свойства count не имеет?

Anatoly
06.09.2016
13:50:39

Dmitry
06.09.2016
13:50:54
Давай на ты лучше)

Eto
06.09.2016
13:51:00

Dmitry
06.09.2016
13:51:09
нет, там конечный
О, походу вот что можно заюзать для dirEntries http://dlang.org/phobos/std_algorithm_searching.html#.count
чтобы размер узнать

Anatoly
06.09.2016
13:55:34
нет, там конечный
кстати, там ещё отфильтровать надо результат. Могут попасться директории, а в итоге преобразовать в массив и просто получить проперть с размером

Oleg
06.09.2016
13:55:49

Dmitry
06.09.2016
13:58:29
я думаю что директории можно отфильтровать шаблоном *.* или тоже косячный вариант?

Oleg
06.09.2016
13:58:58
поэтому count просто скопирует range пройдётся по нему, посчитает и вернёт, но проходиться будет

Dmitry
06.09.2016
13:59:02
auto files = dirEntries(r.arch_path, SpanMode.breadth);
writeln("count: ", count(files));
так норм?

Oleg
06.09.2016
13:59:33

Dmitry
06.09.2016
13:59:52
а зачем второй раз ходить то?

Oleg
06.09.2016
14:00:02
а зачем тебе просто количество то?)
может я прост что-то прослушал...

Google

Anatoly
06.09.2016
14:00:23
охм, можно просто сосчитать тогда ошибки)
0 - круто, прошли директорию

Dmitry
06.09.2016
14:00:33
ну чтобы в foreach проверить и на последнем файле вызвать функцию updateFlags

Anatoly
06.09.2016
14:01:39
на последнем? После цикла?

Oleg
06.09.2016
14:02:05
foreach( file; dirEntry(...) )
{
if (processFile(file) == success)
successCount++;
count++;
}
сравниваешь потом count и successCount
если равны, то ок, если нет, то нет

Dmitry
06.09.2016
14:03:14
м... а мой вариант чем плох? Твой конечно красивее, но все же

Eto
06.09.2016
14:05:33
`dirEntries` возвращает lazy-range.

Dmitry
06.09.2016
14:07:23
тоесть count его не сможет правильно посчитать?
и что он тогда он посчитает? какое значение отдаст сount

Eto
06.09.2016
14:08:00
Сможет, но поглотит range при этом.

Dmitry
06.09.2016
14:09:08
вообще не понял предложение. Можешь как-то подоступнее?

Eto
06.09.2016
14:13:01
Знаешь что такое lazy range?

Dmitry
06.09.2016
14:13:22
то что вычисляется в момент когда оно нужно

Eto
06.09.2016
14:16:41
Короче, используй std.array.array, чтобы получить массив.

Dmitry
06.09.2016
14:18:44
ну я правильно сказал про lazy range?

Oleg
06.09.2016
14:21:32

Dmitry
06.09.2016
14:22:00
но в моем случае count для lazy range что вернет то?

Oleg
06.09.2016
14:22:48
но тут lazy не потому что так прикольно, а потому что по другому никак (опять же если я не ошибаюсь), потому что файлы в файле директории хранятся тупо подряд и чтобы вернуть количество нужно прочитать все inodes, что собственно ты во второй раз будешь делать потом

Google

Oleg
06.09.2016
14:23:01
а count не должен пожирать диапазон
вроде

Dmitry
06.09.2016
14:23:33
size_t count(alias pred = "a == b", Range, E)(Range haystack, E needle)

Oleg
06.09.2016
14:24:37
просто он пройдётся по всему файлу директории и, в зависимости от настройки вложенности, по всем внутренним только для подсчёта количества, а во второй раз при обработке тебе это дело придётся делать
2 раза будешь ходить по всем файлам: не оптимально
но count должен вернуть правильное количество и не должен ломать диапазон

Dmitry
06.09.2016
14:25:29
Погоди. Но вот функция:
auto files = dirEntries(r.arch_path, SpanMode.breadth);
вернет массив dirEntry так? Этот массив = диапазон. И его я могу посчитать. Так же?

Oleg
06.09.2016
14:25:46
auto files = dirEntries(...);
auto cnt = files.count; // первый проход
foreach( file; files ) { /+ второй проход +/ }
либо можешь сразу files в массив превратить, тогда будет один проход

Admin
ERROR: S client not available

Oleg
06.09.2016
14:28:26
но памяти затребует на все имена и атрибуты файлов

Dmitry
06.09.2016
14:28:27
а...

Oleg
06.09.2016
14:28:36
если их десятки тысяч, то так не стоит делать

Dmitry
06.09.2016
14:47:37
Тоесть ленивая функция высчитывается при каждом обращении? А если бы она не была ленивой то повторного обращения бы не было?

Eto
06.09.2016
15:18:34
Без повторного обращения — нет повторного вычисления.
https://www.packtpub.com/books/content/understanding-ranges
http://tour.dlang.org/tour/en/basics/ranges
И моя имплементация: https://dpaste.dzfl.pl/e1b48621297e
а count не должен пожирать диапазон
Полагаю зависит от range. Например, в vibed range с данными из монги нельзя дважды проитерировать. Потому что внутри он использует монговский курсор.

Oleg
06.09.2016
15:48:01
семантика классов-диапазонов отличается от структур-диапазонов

Google

Oleg
06.09.2016
15:48:12
слабое место стандартной библиотеки

Eto
06.09.2016
15:49:19
В vibed это структура, которая внутри держит ссылку на класс.

Oleg
06.09.2016
15:50:50
ну смысл в этом
нет проверки на то что состояние может или не может быть однозначно сохранено
будь то класс (ссылочная семантика), будь то структура с внешней ссылкой

Dmitry
06.09.2016
17:33:04
Хорошо. Буду дома с компа почитаю. Пока получается все ленивые переменные дергают функции их получающие каждый раз?

Oleg
06.09.2016
19:13:13

Dmitry
06.09.2016
19:16:35
А это реально удобно? Ведь наверно это кучу проблем создает
М... типа чтобы мы могли начать обработку директорий до того как полный список получим?

Eto
06.09.2016
19:55:38
Полный список тебе далеко не всегда надо. А если он весь тебе не нужен, то зачем делать лишние операции и выделять лишнюю память?

Dmitry
06.09.2016
19:57:14
а можешь пару типовых ситуации привести?
когда он весь может быть не нужен

Eto
06.09.2016
19:58:06
Например, последовательность Фибоначчи. Ты её всю просто не можешь иметь.

Dmitry
06.09.2016
19:58:33
а можно какой-то более житейский пример
ну там в работе с БД или ФС

Eto
06.09.2016
19:58:41
Твоя же ситуация, к примеру. Можно сделать и без подсчета количества файлов.
Запрашиваешь данные из БД. БД не возвращает всё найденное, ибо результат может содержать миллиарды записей.

Dmitry
06.09.2016
20:00:49
а разве это не по части драйвера?

Eto
06.09.2016
20:00:59
И что?

Dmitry
06.09.2016
20:01:06
он типа уметь должен это. или эта фишка в нем на базе ленивых диапазонов делается

Eto
06.09.2016
20:01:12
Драйвера тоже кому-то надо писать.
Плюс, в использовании lazy последовательностей, есть оптимизация — ты тратишь меньше времени на работу с памятью.