小编kmd*_*eko的帖子

使用 rust-analyzer 时如何删除类型注释帮助?

对于 VS Code,我用来rust-analyzer处理语法突出显示和飞行检查。

如何去掉下面灰色的inlay类型和参数注释?

在此输入图像描述

rust visual-studio-code rust-analyzer

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

Rust 中的“<[_]>”是什么?

vec!宏实现中有这样的规则:

($($x:expr),+ $(,)?) => (
    $crate::__rust_force_expr!(<[_]>::into_vec(box [$($x),+]))
);
Run Code Online (Sandbox Code Playgroud)

<[_]>里面到底是什么?

syntax rust

36
推荐指数
2
解决办法
4492
查看次数

如何使用追踪库?

我这里有一个非常简单的代码示例,它只想获取我传入的列表的第一项。我一直在尝试通过跟踪来检测代码帮助调试应用程序,但坦率地说,文档太复杂了,我无法完全理解。

use std::fmt::Debug;
use tracing::{span, Level, event};

fn main() {
    pub fn calculate<T: Debug, const N: usize>(data_set: [T; N]) -> (i32, i32) {

        // Tracing BoilerPlate
        event!(Level::INFO, "something happened");
        let span = span!(Level::INFO, "my_span");
        let _guard = span.enter();
        
        // Key Code 
        let _var = data_set.get(0);
        println!("Output_1: {:?}", data_set.get(0)); 
        
        event!(Level::DEBUG, "something happened inside my_span");
        
        // Ignore
        return (0, 0)
    }

    let data = [1509, 1857, 1736, 1815, 1576];
    let _result = calculate(data);
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我不明白在哪里可以查看event!日志。它们似乎没有打印到任何窗口或文件或任何东西。

有人可以指导我在哪里可以找到这些调试日志,或者为我提供如何使用跟踪箱的简化说明吗?

rust rust-tracing

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

分配给下划线模式时会发生什么?

这是 Rust 测验 28 中的一个问题:

struct Guard;

impl Drop for Guard {
    fn drop(&mut self) {
        print!("1");
    }
}

fn main() {
    let _guard = Guard;
    print!("3");
    let _ = Guard;
    print!("2");
}
Run Code Online (Sandbox Code Playgroud)

这样的代码3121在 main 的第三行中打印 ,分配给_意味着立即删除。但是,当转移所有权时_使用以下代码

struct Guard;

impl Drop for Guard {
    fn drop(&mut self) {
        print!("1");
    }
}

fn main() {
    let _guard = Guard;
    print!("3");
    let _ = _guard;
    print!("2");
}
Run Code Online (Sandbox Code Playgroud)

它打印321,这意味着Guard没有立即删除,并且_拥有Guard? …

ownership rust

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

如何在 Tokio 运行时上下文中从异步方法调用的非异步方法中等待 future?

我正在使用 Tokio 1.1 来做异步事情。我有一个async mainwith #[tokio::main],所以我已经在使用运行时进行操作。

main调用一个非异步方法,我希望await在未来(具体来说,我正在从数据融合数据帧收集)。这种非异步方法具有由特征规定的签名,该特征返回结构体,而不是Future<Struct>. 据我所知,我无法将其标记为异步。

如果我尝试打电话df.collect().await;,我会得到

只允许在async函数和块内部

来自编译器的错误,指出我await在其中调用的方法不是async.

如果我尝试block_on从一个新的运行时开始,未来是这样的:

tokio::runtime::Builder::new_current_thread()
    .build()
    .unwrap()
    .block_on(df.collect());
Run Code Online (Sandbox Code Playgroud)

我遇到运行时恐慌:

无法从运行时内部启动运行时。发生这种情况是因为函数(如block_on)试图在当前线程用于驱动异步任务时阻止该线程。

如果我尝试futures::executor::block_on(df.collect()).unwrap();,我会遇到新的运行时恐慌:

“当前未在 Tokio 0.2.x 运行时上运行。”

这很奇怪,因为我使用的是 Tokio v1.1。

这感觉比应该的更难。我处于异步上下文中,感觉编译器应该知道这一点并允许我.await从方法内调用 - 唯一的代码路径从块内调用此方法async。有没有一种简单的方法可以做到我所缺少的?

future rust async-await rust-tokio

24
推荐指数
1
解决办法
2万
查看次数

如何在 Rust 中等待异步函数调用列表?

async我有一个要同时执行的函数列表,然后等待所有函数完成。我现在的工作代码是:

async fn start_consumers(&self) {
    for consumer in &self.consumers {
        consumer.consume().await;
    }
}
Run Code Online (Sandbox Code Playgroud)

这不太准确,因为函数是串行执行的。我正在寻找类似join!, 但适用于动态向量的东西。这样我应该能够写出类似的东西:

async fn start_consumers(&self) {
    let mut v = Vec::new();
    for consumer in &self.consumers {
        consumer.consume();
    }
    join!(v);
}
Run Code Online (Sandbox Code Playgroud)

目前join!仅支持元组。我正在寻找替代方案。类似于Promise.all()JavaScript 中的东西。

concurrency rust async-await

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

如何将lazy_static与async/await初始化器一起使用?

我使用mongodbtokio作为我的异步运行时。

Client我想全局初始化 MongoDB,所以我使用了惰性静态箱。问题是客户端是异步连接的,lazy_static!不支持async关键字:

use mongodb::Client;

async {
    let client = Client::with_uri_str(&env_var("MONGO_URL")).await.unwrap();
}
Run Code Online (Sandbox Code Playgroud)

那么我该如何初始化呢client

有关的:

rust async-await

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

如何使用 Tokio 在每个周期或间隔(以秒为单位)触发函数?

在 Node.js 中,我可以设置触发某个事件的时间间隔,

function intervalFunc() {
  console.log('whelp, triggered again!');
}

setInterval(intervalFunc, 1500);
Run Code Online (Sandbox Code Playgroud)

然而,Tokio间隔的界面有点复杂。这似乎与间隔的更字面定义有关,而不是按间隔调用函数,它只是停止线程直到时间过去(使用.await)。

Tokio 中是否有一个原语“每 x 秒”调用一个函数或类似函数?如果没有,是否有一个习语可以做到这一点?

我只需要定期运行一个函数...我也不关心其他线程。它只是 Tokio 事件循环中的一个函数。

loops intervals rust rust-tokio

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

std::sync::Mutex 与 tokio::sync::Mutex 有什么区别?

与“普通”互斥体相比,什么是“异步”互斥体?Mutex我相信这是 tokio和普通 std lib之间的区别Mutex。但从概念上讲,我不明白互斥体如何“异步”。难道不是一次只有一件事可以使用它吗?

mutex rust rust-tokio

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

为什么 Borrow 和 AsRef 的实现方式不同?

BorrowRust 中的和特征AsRef非常相似。如果我理解正确的话,它们在同一类型上实现时具有完全相同的签名(方法名称除外),区别在于它们的使用方式。

但是,当您查看它们的实现时,例如,Vec<T>就会发现细微的差别:

切片.rs

#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Borrow<[T]> for Vec<T> {
    fn borrow(&self) -> &[T] {
        &self[..]
    }
}
Run Code Online (Sandbox Code Playgroud)

向量.rs

#[stable(feature = "rust1", since = "1.0.0")]
impl<T> AsRef<[T]> for Vec<T> {
    fn as_ref(&self) -> &[T] {
        self
    }
}
Run Code Online (Sandbox Code Playgroud)

我相信这里的实施AsRef得益于Deref强制。但不能使用相同的机制来Borrow实现吗?

rust

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