Rust 学习笔记:关于消息传递的练习题
Rust 学习笔记:关于消息传递的练习题
参考视频:
- https://www.bilibili.com/video/BV1z3XGYBEhz
问题一
以下程序能否通过编译?若能,输出是?
use std::sync::mpsc;
use std::thread;
enum ClientMessage { Incr, Get, Quit }
enum ServerMessage { Get(usize) }
fn main() {
let (server_tx, client_rx) = mpsc::channel();
let (client_tx, server_rx) = mpsc::channel();
let server = thread::spawn(move || {
let mut n = 0;
loop {
match server_rx.recv().unwrap() {
ClientMessage::Quit => break,
ClientMessage::Incr => n += 1,
ClientMessage::Get => server_tx.send(ServerMessage::Get(n)).unwrap(),
}
}
});
for msg in [ClientMessage::Incr, ClientMessage::Get, ClientMessage::Quit] {
client_tx.send(msg).unwrap();
}
if let ServerMessage::Get(n) = client_rx.recv().unwrap() {
println!("{}", n);
}
server.join().unwrap();
}
答:可以通过编译。输出 1。
问题二
以下程序能否通过编译?若能,输出是?
use std::sync::mpsc;
use std::thread;
enum ClientMessage { Incr, Get, Quit }
enum ServerMessage { Get(usize) }
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let s = String::from("Hello world");
tx.send(s.clone()).unwrap();
tx.send(s.len()).unwrap();
});
let s = rx.recv().unwrap();
let n = rx.recv().unwrap();
println!("{} {}", s, n);
}
答:不能通过编译。
Rust 的通道是强类型的,mpsc::channel() 会基于第一次发送的值推断类型。第一次发送 String 后,通道类型固定为 mpsc::Sender<String>。后续尝试发送 usize 会导致类型错误。