Size: a a a

2020 March 05

P

Pavel in rust_offtopic
тоесть ты создавал две, вместо них создал одну, они выполнились один раз, она ж одна, точно так же и с не-ленивыми
источник

DS

Doge Shibu in rust_offtopic
Pavel
посмотрел ещё раз, не понял, чем отличается от не-ленивых
В случае такого рефакторинга не ленивых ты теряешь поведение, потому что вместов вывода
"BOOM"
"BOOM"
в консоль ты получишь только "BOOM".

В случае рефакторинга ленивых ты в обоих случаях получишь:
"BOOM"
"BOOM"
Т.е. поведение полностью сохранилось после такого рефакторинга
источник

P

Pavel in rust_offtopic
Doge Shibu
В случае такого рефакторинга не ленивых ты теряешь поведение, потому что вместов вывода
"BOOM"
"BOOM"
в консоль ты получишь только "BOOM".

В случае рефакторинга ленивых ты в обоих случаях получишь:
"BOOM"
"BOOM"
Т.е. поведение полностью сохранилось после такого рефакторинга
тоесть это ничем не отличается от лямбды?
источник

DS

Doge Shibu in rust_offtopic
Pavel
тоесть это ничем не отличается от лямбды?
Ну только у тебя все по умолчнию футуры обернуты в лямбду.
источник

P

Pavel in rust_offtopic
Doge Shibu
Ну только у тебя все по умолчнию футуры обернуты в лямбду.
Future<T>::get такая же лямбда, как и () -> T
источник

P

Pavel in rust_offtopic
тоесть я могу future.get(), а могу future::get
источник

P

Pavel in rust_offtopic
и на месте первого я могу класть объект, а на месте второго -- любую () -> T
источник

P

Pavel in rust_offtopic
тоесть, если мне надо будет читать лениво -- я возьму лямбду, если не-лениво -- возьму фьючу и начну исполнять до того, как мне понадобится значение
источник

P

Pavel in rust_offtopic
при этом можно это абстрагировать до одного интерфейса -- Callable<T> throws Exception, или Supplier<T> если нужен Infallable
источник

DF

Dollar Føølish in rust_offtopic
Чё тут. В итоге пришли к тому что ленивые футуры это просто функции ?
источник

P

Pavel in rust_offtopic
Dollar Føølish
Чё тут. В итоге пришли к тому что ленивые футуры это просто функции ?
как всегда, да
источник

p

polunin.ai in rust_offtopic
Doge Shibu
Разница в том, что если десугарить эту запись как было тобой предложено, то программы в ней не будут ссылочно прозрачны, как ты и указал в примере выше.

А если десугарить по второму варианту, то это свойство будет сохранятся, т.е. есть ли мы заменим read_line_io на возвращаемое значение, то получим:
(lambda _: получение из консоли строки).bind(lambda a: a + "\n")

Что сохранит нужное нам поведение
то есть ссылочная прозрачность ради ссылочной прозрачности?
источник

p

polunin.ai in rust_offtopic
Doge Shibu
Вот пример этого я прям выше и кидал:

https://imgur.com/S19Nr4a.png

Вот тут Future - это не ленивый таск, который запускается сразу.

Из-за этого мы можем получить проблемы даже при малейших изменениях кода, как в примерах, или поведение с неявно непредсказуемым порядком действий.
сначала всегда должно быть fa, затем fb
источник

DS

Doge Shibu in rust_offtopic
Pavel
тоесть, если мне надо будет читать лениво -- я возьму лямбду, если не-лениво -- возьму фьючу и начну исполнять до того, как мне понадобится значение
Ну пробема в том, что если совмещать ленивые и не ленивые футуры, то преимущества ленивых теряются.

Ты уже не можешь смело рефакторить код не включая мозг, т.к. можешь испортить при рефакторинге изначальное поведение даже небольшими правками.
источник

P

Pavel in rust_offtopic
Doge Shibu
Ну пробема в том, что если совмещать ленивые и не ленивые футуры, то преимущества ленивых теряются.

Ты уже не можешь смело рефакторить код не включая мозг, т.к. можешь испортить при рефакторинге изначальное поведение даже небольшими правками.
так если у тебя код должен выполняться каждый раз -- зачем его заворачивать в футуру?
источник

P

Pavel in rust_offtopic
это как бы собственная характеристика "функции" она либо функция как есть и её можно при желании выполнять асинхронно, либо она футура -- кешированный результат
источник

DS

Doge Shibu in rust_offtopic
Pavel
так если у тебя код должен выполняться каждый раз -- зачем его заворачивать в футуру?
Футуры возникнут везде, где есть Input/Output, конкурентность, параллельность или мутабельный между тредами стейт.
источник

DS

Doge Shibu in rust_offtopic
В других местах можно и не заворачивать.
источник

P

Pavel in rust_offtopic
Doge Shibu
Футуры возникнут везде, где есть Input/Output, конкурентность, параллельность или мутабельный между тредами стейт.
почему?
источник

DS

Doge Shibu in rust_offtopic
Pavel
почему?
Потому что если эти вещи как-то не оборачивать, то теряется ссылочная прозрачность всей программы.

Т.к. это побочные эффекты, вызов которых вне обертке приводит к потери программой хороших свойств
источник