在vec!宏实现中有这样的规则:
($($x:expr),+ $(,)?) => (
$crate::__rust_force_expr!(<[_]>::into_vec(box [$($x),+]))
);
Run Code Online (Sandbox Code Playgroud)
<[_]>里面到底是什么?
我这里有一个非常简单的代码示例,它只想获取我传入的列表的第一项。我一直在尝试通过跟踪来检测代码以帮助调试应用程序,但坦率地说,文档太复杂了,我无法完全理解。
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 测验 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? …
我正在使用 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。有没有一种简单的方法可以做到我所缺少的?
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 中的东西。
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?
有关的:
在 Node.js 中,我可以设置触发某个事件的时间间隔,
function intervalFunc() {
console.log('whelp, triggered again!');
}
setInterval(intervalFunc, 1500);
Run Code Online (Sandbox Code Playgroud)
然而,Tokio间隔的界面有点复杂。这似乎与间隔的更字面定义有关,而不是按间隔调用函数,它只是停止线程直到时间过去(使用.await)。
Tokio 中是否有一个原语“每 x 秒”调用一个函数或类似函数?如果没有,是否有一个习语可以做到这一点?
我只需要定期运行一个函数...我也不关心其他线程。它只是 Tokio 事件循环中的一个函数。
与“普通”互斥体相比,什么是“异步”互斥体?Mutex我相信这是 tokio和普通 std lib之间的区别Mutex。但从概念上讲,我不明白互斥体如何“异步”。难道不是一次只有一件事可以使用它吗?
BorrowRust 中的和特征AsRef非常相似。如果我理解正确的话,它们在同一类型上实现时具有完全相同的签名(方法名称除外),区别在于它们的使用方式。
但是,当您查看它们的实现时,例如,Vec<T>就会发现细微的差别:
#[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)
#[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 ×10
async-await ×3
rust-tokio ×3
concurrency ×1
future ×1
intervals ×1
loops ×1
mutex ×1
ownership ×1
rust-tracing ×1
syntax ×1