我试图在Rust中编写一个简单的TCP echo服务器,并且我对如何将匹配中的值返回到Err感到困惑。
我知道返回类型应该是usize
,并且我想返回零。在其他语言中,我只会return 0;
但Rust不会让我。我也试过usize::Zero()
。我确实通过let s:usize = 0; s
来实现它,但这看起来非常愚蠢,我想有更好的方法可以做到。
let buffer_length = match stream.read(&mut buffer) {
Err(e) => {
println!("Error reading from socket stream: {}", e);
// what do i return here?
// right now i just panic!
// return 0;
},
Ok(buffer_length) => {
stream.write(&buffer).unwrap();
buffer_length
},
};
我知道我也可能没有match
返回任何内容并使用函数调用或其他内容在buffer_length
内消费match
,但我不想在这种情况。
处理这类事情最惯用的方法是什么?
答案 0 :(得分:9)
与你"返回相同的方式"来自buffer_length
手臂内的Ok
,您可以简单地"返回"保留0
的{{1}} Err
,不带return
或分号。
return
始终从函数返回。如果你想获得表达式的值,那么在Rust中你不需要做任何事情。这总是自动发生。
这与您的let s = 0; s
解决方法有效的原因相同。您所做的只是插入一个临时变量,但您也可以直接将表达式转发到外部表达式。
let buffer_length = match stream.read(&mut buffer) {
Err(e) => {
println!("Error reading from socket stream: {}", e);
0
},
Ok(buffer_length) => {
stream.write(&buffer).unwrap();
buffer_length
},
};