如何获取从另一个函数struct返回的 a的值Result?下面举例。
#[derive(Debug)]
pub struct Keypair(ed25519_dalek::Keypair);
pub fn keypair_from_seed(seed: &[u8]) -> Result<Keypair, Box<dyn error::Error>> {
let dalek_keypair = ed25519_dalek::Keypair { secret, public };
Ok(Keypair(dalek_keypair))
}
Run Code Online (Sandbox Code Playgroud)
fn main(){
//here seed_bytes is mnemonics
let sk = keypair_from_seed(&seed_bytes);
//sk contains the secret key and public key, i want to extract it different secret key & public key
}
Run Code Online (Sandbox Code Playgroud)
Aio*_*ono 10
Result让我们看看Rust 文档中的定义
enum Result<T, E> {
Ok(T),
Err(E),
}
Run Code Online (Sandbox Code Playgroud)
因此 aResult要么Ok包含 type 的值T,要么Err包含 type 的值E。
您有几个选项可以提取该值。
Ok如果结果是Ok或使程序出现恐慌(程序被终止),则该函数返回该值。如果您确定它不包含错误,或者您只是想先编写正确的情况,然后再处理错误处理,那么这是有意义的,但您不应该一直使用它,因为当值为不是Ok。你可以这样使用它
let val = result.unwrap();
// or
let val = result.expect("oops not Ok");
Run Code Online (Sandbox Code Playgroud)
唯一不同的是expect您可以自己提供错误消息而不是标准错误消息unwrap。
在 Rust 中,模式匹配用于enum类型,以便用户可以根据枚举的当前变体执行必要的操作。你可以这样使用它
match result {
Ok(val) => {
// Use val here....
},
Err(err) => {
// Do something with the error if you want
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只想处理一种变体,您也可以使用if let这样的语句
if let Some(val) = result {
// Do something with val
}
Run Code Online (Sandbox Code Playgroud)
如果你觉得很自信
let sk = keypair_from_seed(&seed_bytes).unwrap();
Run Code Online (Sandbox Code Playgroud)
或者
let sk = keypair_from_seed(&seed_bytes).expect("my own failure message");
Run Code Online (Sandbox Code Playgroud)
但是,建议这样进行
if let Ok(sk) = keypair_from_seed(&seed_bytes) {
// ... use sk ...
} else {
// ... sk is not available, may be should
// we warn the user, ask for an alternative ...
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想明确处理错误
match keypair_from_seed(&seed_bytes) {
Ok(sk) => {
// ... use sk ...
},
Err(e) => {
// ... sk is not available, and e explains why ...
},
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果包含这些行的函数也能够返回错误,您可以使用?符号传播它(如果返回的错误
keypair_from_seed()可转换为您的函数返回的错误)
let sk = keypair_from_seed(&seed_bytes)?;
Run Code Online (Sandbox Code Playgroud)
见
unwrap,
expect,
if let,
match,
?