Size: a a a

2021 October 24

D

Denis in Rust Async
1) Потому что RefCell: !Send + !Sync, так что футура, которую создаст генератор, тоже будет !Send и !Sync
2) подумал, не нужен, но и оборачивать ни во что не надо, достаточно вроде мут ссылок, но щас проверю
источник

LB

Let Eat Bee in Rust Async
ну да, но раздвоиться ж какой-нибудь select! не может на два треда
источник

П

Пух in Rust Async
А !Send это именно про номер потока, а не про многопоточность
источник

П

Пух in Rust Async
Условный TLS ты из футуры юзать не можешь
источник

П

Пух in Rust Async
Thread Local Storage*
источник

LB

Let Eat Bee in Rust Async
да я и сейчас с сылками, но их потом не обернуть в StreamExt который поглощают футуру, по этому надо что-то чтоб склонировать) про split не знал, но и без него вроде можно
источник

D

Denis in Rust Async
почему не обернуть? &mut T и пожалуйста
источник

LB

Let Eat Bee in Rust Async
как это  RefCell !Send? наоборот, Send же
источник

D

Denis in Rust Async
ну RefCell-то Send, но дальше ведь Rc понадобится :)
источник

LB

Let Eat Bee in Rust Async
сейчас playground запилю
источник

D

Denis in Rust Async
use futures::stream::Stream;
use tokio::net::TcpStream;
use tokio_tungstenite::WebSocketStream;

fn get_stream() -> WebSocketStream<TcpStream> {
   todo!()
}

fn impls_stream<T: Stream>(_: T) {}

#[tokio::main]
async fn main() {
   let mut stream = get_stream();
   impls_stream(&mut stream);
}
источник

LB

Let Eat Bee in Rust Async
ппц вы тут скоростные. спасибо за шаблон :)
источник

LB

Let Eat Bee in Rust Async
про  todo!() не знал, удобно
источник

D

Denis in Rust Async
нзч, то есть можно делать, например, (&mut stream).map(|x| x).next().await;
источник

D

Denis in Rust Async
хм, сделать
    tokio::select! {
       _ = stream.send(message) => { }
       _ = stream.next() => { }
   }

не получится, т.к. для этого нужно дважы захватить stream по мутабельной ссылке :(
источник

D

Denis in Rust Async
так что таки придётся сплитить
    let (mut sink, mut stream) = stream.split();
   tokio::select! {
       _ = sink.send(get_message()) => { }
       _ = stream.next() => { }
   }
источник

LB

Let Eat Bee in Rust Async
вооот, вот про это  я  иговорил
источник

D

Denis in Rust Async
но и RefCell тут не помощник
    let stream = RefCell::new(stream);
   let send = stream.borrow_mut().send(get_message());
   let receive = stream.borrow_mut().next();


придётся оборачивать в Rc, и тогда прощай многопоток
источник

D

Denis in Rust Async
да и даже если бы по какой-то причине это компилировалось, второй borrow_mut бы паникнул)
источник

LB

Let Eat Bee in Rust Async
блин в playground нету tungstenite
источник