@dlangru

Страница 66 из 719
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
э.... ни слова не понял) я вообще попами (кроме женских) ни разу не пользовался.

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
@ttldtor а мне ответ с какого момента то?
можете сделать счётчик успешного завершения и потом сравнить с количеством фалов в директории, например

вариантов много)

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
ну более красивая реализация чем читать кол-во файлов в каталоге
так у вас уже есть всё и files и его размер легко получить. Или там бесконечный Range?

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

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
О, походу вот что можно заюзать для dirEntries http://dlang.org/phobos/std_algorithm_searching.html#.count
количество элементов, не размер если я не ошибаюсь, просто так количество файлов нельзя узнать, нужно все файлы прочитать из файла директории

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
auto files = dirEntries(r.arch_path, SpanMode.breadth); writeln("count: ", count(files)); так норм?
второй раз ходить по этому пути не будешь?

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
Хорошо. Буду дома с компа почитаю. Пока получается все ленивые переменные дергают функции их получающие каждый раз?

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

М... типа чтобы мы могли начать обработку директорий до того как полный список получим?

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

А это реально удобно? Ведь наверно это кучу проблем создает
Рэнжи в D раз таки решают проблему сложности.

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 последовательностей, есть оптимизация — ты тратишь меньше времени на работу с памятью.

Страница 66 из 719