Отправка значения в канал в Rust
Пара из отправителя и приемника появляется вместе: оба конца ссылаются на одну очередь. Отправитель владеет правом класть значения, приемник позже заберет их. Пока приемник жив, очередь принимает новые элементы.
Подключим модуль очереди и создадим пару, затем передадим целое число:
use std::sync::mpsc;
fn main() {
let (tx, rx) = mpsc::channel();
match tx.send(7) {
Ok(()) => println!("sent"),
Err(_) => println!("fail"),
}
let _ = rx;
}
При живом приемнике отправка завершается вариантом успеха, и число попадает в очередь. Переменная приемника пока не читает очередь, но ее наличие держит канал открытым для отправки.
Если приемник исчезнет раньше, чем очередь опустеет, повторная отправка вернет ошибку. Разберем ответ через сопоставление:
use std::sync::mpsc;
fn main() {
let (tx, _rx) = mpsc::channel();
drop(_rx);
match tx.send(3) {
Ok(()) => println!("ok"),
Err(_) => println!("no receiver"),
}
}
Дано число:
let num = 11;
Создайте пару концов очереди, положите
в нее это число и выведите sent
только при успешной отправке. Приемник
оставьте в переменной до конца main.
Дано число:
let num = 5;
Создайте очередь, сразу уничтожьте
приемник и попробуйте передать число.
Напечатайте closed, если пришла
ошибка отправки.
Скажите, зачем в первом примере приемник остается в переменной, хотя из очереди еще ничего не читают.