Size: a a a

Rust — русскоговорящее сообществo

2020 March 23

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
Клиппи тут ругнулась что я делаю условно
for i in 0..x {
   smt = i;
   arr[i];
}

вместо использования итераторов:
for (i, item) in arr.iter_mut().enumerate().take(x) {
   smt = i;
   item;
}


В чём бонус в читаймости в целом понятно, но почему это может бтыь быстрее?

> https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop
>> Just iterating the collection itself makes the intent more clear and is probably faster.
А ещё надо for X in Y { do Z } заменить на Y.for_each(|X| do Z);, если ты не итератор по одной слайсе делаешь, потому что внутренние ветвления оптимизируются во внешние, когда применяешь try_|fold и try_|for_each на всякие Chain'ы.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Тот же итератор по VecDeque - просто хитро названный чейн по двум слайсам.
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
А ещё надо for X in Y { do Z } заменить на Y.for_each(|X| do Z);, если ты не итератор по одной слайсе делаешь, потому что внутренние ветвления оптимизируются во внешние, когда применяешь try_|fold и try_|for_each на всякие Chain'ы.
Но ведь for_each внутри просто for, не? Какой в этом смысл?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
Но ведь for_each внутри просто for, не? Какой в этом смысл?
Если мы говорим про чейн, то Chain.for_each() превращается в два for'а.
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Если мы говорим про чейн, то Chain.for_each() превращается в два for'а.
М, не знал. Но у меня в любом случае по одной слайсе цикл + с early return
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
М, не знал. Но у меня в любом случае по одной слайсе цикл + с early return
try_for_each() позволяет простые ретёрны делать. И даже иногда чуть более сложные.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Эрик
Если мы говорим про чейн, то Chain.for_each() превращается в два for'а.
Точнее, не в два фора, а в два for_each(). Которые в свою очередь оптимизированы под свои итераторы.
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
try_for_each() позволяет простые ретёрны делать. И даже иногда чуть более сложные.
Мне кажется тут это будет усложнением
источник

В

Вафель in Rust — русскоговорящее сообществo
Но спасибо, не знал о таких вещах
источник

D

Denis in Rust — русскоговорящее сообществo
Эрик
Тот же итератор по VecDeque - просто хитро названный чейн по двум слайсам.
(нет)
источник

Э

Эрик in Rust — русскоговорящее сообществo
Denis
(нет)
Как же нет, когда да? Там же на каждый next() вызывается wrap_index().
источник

D

Denis in Rust — русскоговорящее сообществo
Эрик
Как же нет, когда да? Там же на каждый next() вызывается wrap_index().
это отличается от чейна по двум слайсам чем более, чем совсем )
источник

Э

Эрик in Rust — русскоговорящее сообществo
Denis
это отличается от чейна по двум слайсам чем более, чем совсем )
fn fold<Acc, F>(self, mut accum: Acc, mut f: F) -> Acc
   where
       F: FnMut(Acc, Self::Item) -> Acc,
   {
       let (front, back) = RingSlices::ring_slices(self.ring, self.head, self.tail);
       accum = front.iter().fold(accum, &mut f);
       back.iter().fold(accum, &mut f)
   }
источник

Э

Эрик in Rust — русскоговорящее сообществo
Скажи это ещё раз.
источник

D

Denis in Rust — русскоговорящее сообществo
так, я опять вне контекста, что это про фолды, сорян, был неправ
источник
2020 March 24

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
А в расте можно заавейтить два раза одинаковую футуру? Например:

async fn foo() -> i32 {
}


Я могу вместо

let a = foo().await;
let b = foo().await;


написать:

let foo = foo();
let a = foo.await;
let b = foo.await;


? Не важно, можно рц обернуть, клонами, чем угодно, главное что я хочу вызвать foo один раз.
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
То есть идея в том, что я хочу запустить две идентичные асинхронные операции, но результат не обязательно совпадает, то есть в общем случае a != b
источник

Э

Эрик in Rust — русскоговорящее сообществo
Если они идентичны, то результат совпадёт. А если не идентичны, то не совпадёт. Подели foo() на идентичную и неидентичную части, а потом сделай

let f = foo();
let a = f.do_non_identical().await;
let b = f.do_non_identical().await;
источник

YK

Yevhen Kazmin in Rust — русскоговорящее сообществo
Эрик
Если они идентичны, то результат совпадёт. А если не идентичны, то не совпадёт. Подели foo() на идентичную и неидентичную части, а потом сделай

let f = foo();
let a = f.do_non_identical().await;
let b = f.do_non_identical().await;
идентично обращаются к апи, но от него ответ разный
источник

Э

Эрик in Rust — русскоговорящее сообществo
Yevhen Kazmin
идентично обращаются к апи, но от него ответ разный
То есть, там внутри неидентичность, которую ты не можешь переписать? Так просто вызывай два раза foo(), в чём проблема?
источник