Rust使用prost库如何编写泛型read_message函数读取Protobuf消息
你遇到的编译错误和泛型实现问题有两个核心原因:
- 你代码中的
msg::decode写法完全不符合Rust语法规则:msg是你传入的参数实例,::操作符仅用于访问关联项/模块内容,编译器会把msg识别为未声明的模块,因此抛出对应错误。 - 你不需要额外传入
M类型的实例作为参数:decode是prost::Messagetrait的关联函数,直接通过泛型类型参数M即可调用。
正确的泛型实现代码
fn read_message<M: Message>(stream: &mut TcpStream) -> io::Result<M> { let mut len_buf = [0u8; 4]; stream.read_exact(&mut len_buf)?; let len = i32::from_le_bytes(len_buf); println!("Incoming message length: {}", len); let mut buf = vec![0u8; len as usize]; stream.read_exact(&mut buf)?; // 直接调用泛型类型M的关联函数decode完成解析 let pb_msg = M::decode(buf.as_slice())?; Ok(pb_msg) }
调用方式
你可以通过Rust标准的涡轮鱼语法指定泛型类型,无需传入多余的类型实例,调用代码如下:
let request = read_message::<message::Request>(&mut stream)?; let response = read_message::<message::Response>(&mut stream)?;
如果你一定要保留你设想的传入类型作为参数的调用形式,可以用零大小的PhantomData占位,没有额外性能开销:
use std::marker::PhantomData; fn read_message<M: Message>(_ty: PhantomData<M>, stream: &mut TcpStream) -> io::Result<M> { // 内部实现和上面完全一致 } // 调用方式和你预期的几乎一致 let input = read_message(PhantomData::<message::Request>, &mut stream)?;
内容的提问来源于stack exchange,提问作者matthewmturner
相关产品推荐
相关产品推荐

