标签: rust-result

来自fn的Rust返回结果错误

我希望此函数返回错误结果:

fn get_result() -> Result<String, std::io::Error> {
     // Ok(String::from("foo")) <- works fine
     Result::Err(String::from("foo"))
}
Run Code Online (Sandbox Code Playgroud)

错误信息

error[E0308]: mismatched types
 --> src/main.rs:3:17
  |
3 |     Result::Err(String::from("foo"))
  |                 ^^^^^^^^^^^^^^^^^^^ expected struct `std::io::Error`, found struct `std::string::String`
  |
  = note: expected type `std::io::Error`
             found type `std::string::String`
Run Code Online (Sandbox Code Playgroud)

我很困惑如何在使用预期的结构时打印出错误消息.

rust rust-result

3
推荐指数
2
解决办法
5138
查看次数

折叠后返回结果的闭包

我正在使用正则表达式包来找到这个正则表达式的一些文本:

lazy_static! {
    static ref FIND_STEPS_RE: Regex =
        Regex::new(r"my regex").unwrap();
}
Run Code Online (Sandbox Code Playgroud)

我想找到所有可能的捕获并迭代它们:

FIND_STEPS_RE.captures_iter(script_slice)
Run Code Online (Sandbox Code Playgroud)

每个捕获的元素由2个值组成:操作和数字.例如,输出可以是:

[("+", "10"), ("-", "20"), ("*", "2")]
Run Code Online (Sandbox Code Playgroud)

我想迭代它,解析数字并应用操作.

我试过了:

let e = FIND_STEPS_RE.captures_iter(script_slice)
    .fold(0, |sum, value| apply_decoding_step)?;
Run Code Online (Sandbox Code Playgroud)

在哪里apply_decoding_step:

fn apply_decoding_step(sum: i32, capture: regex::Captures<>) -> Result<i32> {
    let number = parse_number(&capture[2])?;

    match  &capture[1] {
        "+" => Ok(s + number),
        "-" => Ok(s - number),
        "*" => Ok(s * number),
        "/" => Ok(s / number),
        _ => bail!("Unknown step operator"),
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误:

error[E0271]: type mismatch resolving …
Run Code Online (Sandbox Code Playgroud)

fold rust rust-result

3
推荐指数
2
解决办法
920
查看次数

在 Rust 中调用结果迭代器上的映射

我想以“函数式编程”风格编写一些代码。

但是,我从结果迭代器开始,我只想将该函数应用于Ok项目。此外,我想停止第一个错误的迭代(但是,我愿意接受不同的行为)。

到目前为止,我使用的是嵌套map()模式:<iter>.map(|l| l.map(replace))。我认为这是非常丑陋的。

使用每晚的“result_flattening”,我可以将每个嵌套Result<Result<T, E>, E>Result<T, E>. 使用eyre::ContextI 将不同的错误类型转换为eyre::Report错误类型。所有这一切都让人感觉很笨拙。

在 Rust 中写这个的优雅方式是什么?

最小工作示例

#![feature(result_flattening)]
use std::io::BufRead;

use eyre::Context;

fn main() {
    let data = std::io::Cursor::new(b"FFBFFFBLLL\nBFBFBBFRLR\nFFFBFFBLLL");

    let seats: Result<Vec<_>, _> = data
        .lines()
        .map(|l| l.map(replace).context("force eyre"))
        .map(|l| l.map(|s| u32::from_str_radix(&s, 2).context("force eyre")))
        .map(|r| r.flatten())
        .collect();

    println!("{:#?}", seats);
}

fn replace(line: String) -> String {
    line.replace('F', "0")
        .replace('B', "1")
        .replace('L', "0")
        .replace('R', "1")
}
Run Code Online (Sandbox Code Playgroud)

进一步参考:

rust rust-result

3
推荐指数
1
解决办法
731
查看次数

Result&lt;()&gt; 在 Rust 中是什么意思?

我正在查看std::env::current_dir函数文档,这引起了我的注意:

std::io::Result<()>
Run Code Online (Sandbox Code Playgroud)

我的理解是 Result 应该有 aT和 an E。你怎么能用它们代替()

rust rust-result

1
推荐指数
1
解决办法
158
查看次数

为什么在 main 中使用 Result 时,match 臂中需要 return ?

我正在阅读《Rust by Examples》一书。在此示例中,删除returninErr(e) => return Err(e)会导致错误:expected `i32`, found enum `Result`` 。这是为什么?

Err(e) => return Err(e)和 和有什么区别Err(e) => Err(e)

这是示例中的代码:

use std::num::ParseIntError;

fn main() -> Result<(), ParseIntError> {
    let number_str = "10";
    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => return Err(e),
    };
    println!("{}", number);
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

program-entry-point rust rust-result

1
推荐指数
1
解决办法
1839
查看次数

Rust 中的 Result&lt;T, E&gt; 中的“T”代表什么?

官方文档对以下内容进行了大量引用T

enum Result<T, E> {
    Ok(T),
    Err(E),
}
Run Code Online (Sandbox Code Playgroud)

我认为这些是占位符首字母缩略词。虽然E应该代表“错误”,但我不确定T代表什么。

acronym rust rust-result

0
推荐指数
1
解决办法
174
查看次数

为什么 Rustlings 不强迫我使用结果?

经过短暂的尝试,当我运行 Rusling 测试时exercises/error_handling/errorsn.rs,我得到

---- test_ioerror stdout ----
thread 'test_ioerror' panicked at 'assertion failed: `(left == right)`
  left: `"uh-oh!"`,
 right: `"cannot parse integer from empty string"`', exercises/error_handling/errorsn.rs:69:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Run Code Online (Sandbox Code Playgroud)

第 69 行有

assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string());
Run Code Online (Sandbox Code Playgroud)

做一些调试我可以看到read_and_validate(&mut b)正在返回,

Err(ParseIntError { kind: Empty })
Run Code Online (Sandbox Code Playgroud)

我第一次尝试解决这个问题是,

let num: i64 = line.trim().parse().or(Err("uh-oh!")?;
Run Code Online (Sandbox Code Playgroud)

但是uh-oh!在我看到的代码中寻找这似乎毫无意义,

Err(io::Error::new(io::ErrorKind::BrokenPipe, "uh-oh!"))
Run Code Online (Sandbox Code Playgroud)

所以我现在可以说我不应该写“呃 - 哦!” 任何地方。查看我的错误的原因,他们提供的错误代码(我们应该修复)有

b.read_line(&mut line); # unmodified notice they don't …
Run Code Online (Sandbox Code Playgroud)

compiler-errors rust rust-result

0
推荐指数
1
解决办法
590
查看次数

如何重用“结果”?

以下不编译。使这项工作的规范方法是什么?

let file = File::open(&args.path)?;
let reader = BufReader::new(file);

for line in reader.lines() {
    if line?.contains(&args.pattern) {
        println!("{}", line?);
    }
}
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这是错误消息:

let file = File::open(&args.path)?;
let reader = BufReader::new(file);

for line in reader.lines() {
    if line?.contains(&args.pattern) {
        println!("{}", line?);
    }
}
Run Code Online (Sandbox Code Playgroud)

error-handling move rust rust-result

0
推荐指数
1
解决办法
103
查看次数