Size: a a a

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

2020 April 19

f

folex in Rust — русскоговорящее сообществo
A V
для контекста - это реализация кадемлии для сетевого протокола эфира, я пытаюсь написать итератор, который будет проходить по всей таблице пиров от самых близких до самых дальних
(немного оффтопик)
в rust-libp2p есть реализация kademlia, к слову. И есть prior art на эту тему http://mdbailey.ece.illinois.edu/publications/imc18_ethereum.pdf https://www.researchgate.net/publication/335441865_Eclipsing_Ethereum_Peers_with_False_Friends
источник

AV

A V in Rust — русскоговорящее сообществo
folex
(немного оффтопик)
в rust-libp2p есть реализация kademlia, к слову. И есть prior art на эту тему http://mdbailey.ece.illinois.edu/publications/imc18_ethereum.pdf https://www.researchgate.net/publication/335441865_Eclipsing_Ethereum_Peers_with_False_Friends
я пишу ровно по спецификации devp2p discovery v5, которая возможно отличается от того что есть в libp2p (в которой чёрт ногу сломит)
источник

AV

A V in Rust — русскоговорящее сообществo
red75prime
Если есть активная уникальная ссылка на node_table, то больше никаких уникальных ссылок внутрь node_table не может быть. Это UB
о как - то есть мутирующие итераторы с захватом контейнера в принципе невозможны?
источник

f

folex in Rust — русскоговорящее сообществo
Я тут пытаюсь сбилдить тест в отдельный бинарник, и у меня никак не выходит. Я точно помню, что раньше уже делал так, и в target появлялся бинарник теста
cargo build --test mytest

А теперь не появляется. Поведение cargo изменилось, или мне просто clean нужно сделать?
источник

f

folex in Rust — русскоговорящее сообществo
Похоже, теперь оно в /target/debug/deps/mytest-deadbeef уходит
источник

T

Tema in Rust — русскоговорящее сообществo
пока сделал так

let future = do_something();
block_on(future);


компилится вроде
источник

T

Tema in Rust — русскоговорящее сообществo
работает
источник

T

Tema in Rust — русскоговорящее сообществo
видимо, это то, что мне нужно
источник

f

folex in Rust — русскоговорящее сообществo
Алексей Герасимов
spawn где угодно можно заюзать, это аналог new Promise(…) без await, он просто запускает футуру и ты ее резульата уже не получишь, она просто в фоне отработает
Можно получить результат, если хендл взять.

use async_std::task;
let handle = task::spawn(async {});
// after a while ...
task::block_on(handle)
источник

f

folex in Rust — русскоговорящее сообществo
Полезно если пачку таких тасок запускать, и в UnorderedFuture засовывать, или просто join_all на них делать
источник

Э

Эрик in Rust — русскоговорящее сообществo
A V
о как - то есть мутирующие итераторы с захватом контейнера в принципе невозможны?
Зависит от контейнера. Твой сложный, лень разбираться. Вектор простой, поэтому IterMut - можно.
источник

D

Daniel in Rust — русскоговорящее сообществo
Всем привет! Смотрю исходники Box и не могу понять по каким правилам (какому синтаксису) Rust понимает что значение надо разместить именнно в куче, а не на стеке.
Это определяется в зависимости от используемых типажей?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Daniel
Всем привет! Смотрю исходники Box и не могу понять по каким правилам (какому синтаксису) Rust понимает что значение надо разместить именнно в куче, а не на стеке.
Это определяется в зависимости от используемых типажей?
Он просто пихает всё что ты суёшь в Box::new() на кучу.
источник

AV

A V in Rust — русскоговорящее сообществo
Эрик
Зависит от контейнера. Твой сложный, лень разбираться. Вектор простой, поэтому IterMut - можно.
у вектора вообще итератор на арифметике указателей
источник

В

Вафель in Rust — русскоговорящее сообществo
Daniel
Всем привет! Смотрю исходники Box и не могу понять по каким правилам (какому синтаксису) Rust понимает что значение надо разместить именнно в куче, а не на стеке.
Это определяется в зависимости от используемых типажей?
Уже ответил в бегинерсах. Не кросспость пожалуйста.
источник

АГ

Алексей Герасимов in Rust — русскоговорящее сообществo
Tema
пока сделал так

let future = do_something();
block_on(future);


компилится вроде
так у тебя весь поток заблокируется чтобы разрезолвить эту футуру.
> то есть я могу заспавнить асинхронную функцию в обычной? Мне результат и не нужен
да, причем ты можешь отправить ее «в фон» исполняться (плюс в том что одновременно тким образом могут исполняться несколько футур), либо заблочить текущий поток (как ты и сделал). Если основной код синхронный и нужно в одном месте запустить асинхронную функцию то норм вариант. Но делать так в асинхронном коде не надо, весь рантайм встанет
источник

Э

Эрик in Rust — русскоговорящее сообществo
A V
у вектора вообще итератор на арифметике указателей
Потому что он простой и ему можно.
источник

T

Tema in Rust — русскоговорящее сообществo
Алексей Герасимов
так у тебя весь поток заблокируется чтобы разрезолвить эту футуру.
> то есть я могу заспавнить асинхронную функцию в обычной? Мне результат и не нужен
да, причем ты можешь отправить ее «в фон» исполняться (плюс в том что одновременно тким образом могут исполняться несколько футур), либо заблочить текущий поток (как ты и сделал). Если основной код синхронный и нужно в одном месте запустить асинхронную функцию то норм вариант. Но делать так в асинхронном коде не надо, весь рантайм встанет
как не ждать ее? Вот у меня есть просто функция. И ее надо отправить
источник

Э

Эрик in Rust — русскоговорящее сообществo
А со своими контейнерами сам разбирайся, можно там или нельзя. Если на один и тот же элемент можно получить &mut ссылку, то нельзя.
источник

r

red75prime in Rust — русскоговорящее сообществo
A V
о как - то есть мутирующие итераторы с захватом контейнера в принципе невозможны?
Там дело не в итераторе, а в том, что одновременно есть NodeEntries::node_table и ссылки в current_bucket_remaining. В current_bucket_remaining нужно использовать указатели вместо ссылок.
источник