相关疑难解决方法(0)

这个问号操作员是关于什么的?

我正在阅读以下文档File:

//..
let mut file = File::create("foo.txt")?;
//..
Run Code Online (Sandbox Code Playgroud)

什么是?在这条线?我不记得以前在Rust Book中看过它了.

rust

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

Rust中的分号是否可选?

由于分号在Rust中显然是可选的,为什么,如果我这样做:

fn fn1() -> i32 {    
    let a = 1
    let b = 2
    3
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

error: expected one of `.`, `;`, `?`, or an operator, found `let`
 --> src/main.rs:3:9
  |
2 |         let a = 1
  |                  - expected one of `.`, `;`, `?`, or an operator here
3 |         let b = 2
  |         ^^^ unexpected token
Run Code Online (Sandbox Code Playgroud)

syntax rust

31
推荐指数
2
解决办法
6925
查看次数

为什么使用return作为函数中的最后一个语句被认为是错误的样式?

我正在阅读Rust文档,并遇到了以下示例和声明

使用return作为函数的最后一行有效,但被认为是糟糕的样式:

fn foo(x: i32) -> i32 {
    if x < 5 { return x; }

    return x + 1;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以写上面的内容

fn foo(x: i32) -> i32 {
    if x < 5 { return x; }

    x + 1
}
Run Code Online (Sandbox Code Playgroud)

但我更倾向于写前者,因为这更直观.我确实理解函数返回值应该用作表达式,以便后面有效但是为什么不鼓励前者呢?

rust

18
推荐指数
4
解决办法
4482
查看次数

使用panic :: catch_unwind时,在Rust中抑制panic输出

我正在panic::catch_unwind惊慌失措:

use std::panic;

fn main() {
    let result = panic::catch_unwind(|| {
        panic!("test panic");
    });

    match result {
        Ok(res) => res,
        Err(_) => println!("caught panic!"),
    }
}
Run Code Online (Sandbox Code Playgroud)

(游乐场)

这似乎工作得很好,但我仍然得到了恐慌的输出到stdout.我想这只打印出来:

caught panic!
Run Code Online (Sandbox Code Playgroud)

代替

thread '<main>' panicked at 'test panic', <anon>:6
note: Run with `RUST_BACKTRACE=1` for a backtrace.
caught panic!
Run Code Online (Sandbox Code Playgroud)

exception rust

12
推荐指数
2
解决办法
1822
查看次数

在Rust中async/await的目的是什么?

在像C#这样的语言中,给出这个代码(我没有await故意使用关键字):

async Task Foo()
{
    var task = LongRunningOperationAsync();

    // Some other non-related operation
    AnotherOperation();

    result = task.Result;
}
Run Code Online (Sandbox Code Playgroud)

在第一行中,long操作在另一个线程中运行,并Task返回a(即未来).然后,您可以执行另一个与第一个并行运行的操作,最后,您可以等待操作完成.我认为,这也是行为async/ await在Python,JavaScript等

另一方面,在Rust中,我在RFC中读到:

Rust的期货与其他语言的期货之间的根本区别在于,除非进行调查,否则Rust的期货不会做任何事情.整个系统是围绕这个建立的:例如,取消正在降低未来正是出于这个原因.相比之下,在其他语言中,调用异步fn会旋转一个立即开始执行的未来.

在这种情况下,是什么目的async/ await鲁斯特?看到其他语言,这种表示法是一种运行并行操作的便捷方式,但是如果调用async函数没有运行任何东西,我无法看到它在Rust中是如何工作的.

syntax asynchronous future rust async-await

12
推荐指数
3
解决办法
4729
查看次数

如何在Ok上解开结果或从Err上的函数返回?

我有一个函数调用另一个返回a的函数Result。我需要检查Resultis是OkErr,如果它是an Err,则需要return从我的函数开始。这就是我现在正在做的:

match callable(&mut param) {
    Ok(_v) => (),
    Err(_e) => return,
};
Run Code Online (Sandbox Code Playgroud)

有没有更惯用的Rust方法来做到这一点?

rust

7
推荐指数
3
解决办法
2067
查看次数

在 Rust 中使用 return 语句和省略分号有什么区别?

我正在编写一个函数,该函数在成功(和失败)时返回 serde_json::Value。以前在 Rust 中,我一直省略分号以从函数返回数据,如下面的代码示例所示:

use serde_json::{Result, Value};
use core::result::Result as ResultCore;

fn returning_function() -> ResultCore<Value, Value> {
    let data = r#"
    {
        "status": "ok",
        "response": {
            "data": "secret message!"
         }
    }
    "#;

    match str_to_json(data) {
        Ok(json_data) => match json_data["status"].as_str() {
            Some(status_str) => {
                if status_str == "ok" {
                    Ok(json_data["response"].clone())
                }
            }
            None => eprintln!("\"status\" was not a string")
        }
        Err(error) => eprintln!("something went wrong! here's what: {}", error)
    }

    Err(serde_json::Value::Null)
}

fn str_to_json(json_data: &str) -> Result<Value> {
    Ok(serde_json::from_str(json_data)?)
}
Run Code Online (Sandbox Code Playgroud)

这是我不明白的部分:这不能编译。Rust …

return rust serde-json

6
推荐指数
2
解决办法
664
查看次数

打开或继续循环

考虑一下:

loop {
    let data = match something() {
        Err(err) => {
            warn!("An error: {}; skipped.", err);
            continue;
        },
        Ok(x) => x
    };

    let data2 = match somethingElse() {
        Err(err) => {
            warn!("An error: {}; skipped.", err);
            continue;
        },
        Ok(x) => x
    };

    // and so on
}
Run Code Online (Sandbox Code Playgroud)

如果我不需要分配ok值data,我会使用if let Err(err) = something(),但是上面的代码是否有快捷方式,以避免复制粘贴Err/Ok分支,我认为,典型情况?像这样的东西if let也会返回ok值.

rust

2
推荐指数
4
解决办法
1470
查看次数