如何从结果中获取值?

Nag*_*j M 7 rust

如何获取从另一个函数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

您有几个选项可以提取该值。

1- result.unwrap() 或 result.expect("错误消息")

Ok如果结果是Ok或使程序出现恐慌(程序被终止),则该函数返回该值。如果您确定它不包含错误,或者您只是想先编写正确的情况,然后再处理错误处理,那么这是有意义的,但您不应该一直使用它,因为当值为不是Ok。你可以这样使用它

let val = result.unwrap();
// or
let val = result.expect("oops not Ok");
Run Code Online (Sandbox Code Playgroud)

唯一不同的是expect您可以自己提供错误消息而不是标准错误消息unwrap

2-模式匹配

在 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)


pro*_*-fh 9

如果你觉得很自信

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, ?