从匹配返回值到Err(e)

时间:2015-10-14 04:08:50

标签: rust

我试图在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,但我不想在这种情况。

处理这类事情最惯用的方法是什么?

1 个答案:

答案 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
    },
};