Questions tagged «rust»

Rust是一种没有垃圾回收器的系统编程语言,主要关注三个目标:安全性,速度和并发性。使用此标签可解决有关用Rust编写的代码的问题。对于特定于代码的问题,请使用特定于版本的标签,例如需要使用特定版本的代码,例如[rust-2018]。对[rust-cargo]和[rust-macros]等子主题使用更具体的标签。

1
当变量和函数具有相同的名称时,如何调用函数?
变量和函数具有相同的名称。如何调用该函数? fn main() { let a = 1; fn a() -> i32 { 2 } println!("{}", a()); } Rust编译器告诉我: error[E0618]: expected function, found `{integer}` 换句话说,Rust编译器不调用该a函数,而是访问该a变量。
10 rust 

1
`| _ |和有什么不一样?异步移动{}`和`异步移动| _ | {}`
让我们考虑以下示例: 主 use futures::executor::block_on; use futures::future::{FutureExt, TryFutureExt}; async fn fut1() -> Result<String, u32> { Ok("ok".to_string()) } fn main() { println!("Hello, world!"); match block_on(fut1().and_then(|x| async move { Ok(format!("{} is \"ok\"", x)) })) { Ok(s) => println!("{}", s), Err(u) => println!("{}", u) }; } 货代 [dependencies] futures = "^0.3" 我要问的是表达式|x| async move …
10 rust 

1
如何使用将引用作为回调的Rust异步fn?
async fn返回实现的匿名类型Future,因此,如果我们要将其用作回调,则需要将返回值转换为trait对象。 我试图编写一个函数来执行此操作,但是我遇到了一些终身问题。 async fn将返回所有参数的生存期,因此回调的签名也需要。如何将生存期添加到回调的返回值? use futures::future::{Future, FutureExt, LocalBoxFuture}; type Context = (); type AsyncCb = Box<dyn for<'r> FnOnce(&'r Context) -> LocalBoxFuture<'r, ()>>; fn normalize_async_cb<Fut: Future<Output = ()>>(f: for<'r> fn(&'r Context) -> Fut) -> AsyncCb // how to add 'r for Fut? ^^^ { let cb = move |ctx: &Context| …
10 rust  async-await 

1
为什么添加第二个impl可以防止对参数进行反引用强制转换?
尝试将impl添加Add<char> for String到标准库时遇到了这个问题。但是我们可以轻松地复制它,而无需操作员恶作剧。我们从这个开始: trait MyAdd<Rhs> { fn add(self, rhs: Rhs) -> Self; } impl MyAdd<&str> for String { fn add(mut self, rhs: &str) -> Self { self.push_str(rhs); self } } 很简单。这样,将编译以下代码: let a = String::from("a"); let b = String::from("b"); MyAdd::add(a, &b); 请注意,在这种情况下,第二个参数表达式(&b)具有类型&String。然后将其反强制执行&str,然后函数调用起作用。 但是,让我们尝试添加以下内容: impl MyAdd<char> for String { fn add(mut …

1
是否应该使用同步角色,actix_web :: web :: block或futures-cpupool运行柴油?
背景 我正在通过r2d2使用柴油的actix-web应用程序上工作,并且不确定如何最好地进行异步查询。我发现了三个看似合理的选择,但不确定哪个是最好的。 潜在解决方案 同步演员 对于我来说,我可以使用actix示例,但是它非常复杂,需要大量样板来构建。我希望有一个更合理的解决方案。 Actix_web::web::block 作为另一个选择,我可以使用将actix_web::web::block查询功能包装到将来,但是我不确定这样做的性能含义。 然后,该查询是否在同一Tokio系统中运行?从我在源代码中可以找到的地方,它在底层的actix-web线程池中创建了一个线程。那是问题吗? 如果我没看错代码,则r2d2在获取连接时会阻塞其线程,这会阻塞部分核心actix-web池。与数据库查询相同。如果我执行的查询多于该池中的线程数,这将阻止所有actix-web?如果是这样,那就大问题了。 期货 最终,可能会有一些不必要开销的安全选择是futures-cpupool。主要问题是,这意味着向我的项目中添加另一个板条箱,尽管我不喜欢不必要地在应用程序中浮动多个cpu池的想法。 由于r2d2和柴油都会阻塞,因此这里有令人惊讶的棘手事情。 最重要的是,不要与不使用同一r2d2池的任何事物共享此cpupool(因为创建的所有线程可能只是阻塞等待r2d2连接,在工作存在时锁定整个池)。 其次(更明显一点),因此您不应该拥有比池中线程更多的r2d2连接,反之亦然,因为更大的r2d2连接会浪费资源(连接未使用/线程不断被阻塞)(也许还有一个线程,也许更快)由OS调度程序而不是cpupool调度程序进行连接切换)。 最后,请注意您正在使用哪个数据库以及那里的性能。在写繁琐的sqlite应用程序中运行单个连接r2d2和池中的单个线程可能是最好的方法(尽管我会为此建议一个合适的数据库)。 旧答案 可能有效的旧解决方案 https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/ 本质上,建议使用Futures-cpupool。 在future-rs中封装阻塞I / O的最佳方法是什么? 对于一般情况,建议使用Futures-cpupool。 无效的旧解决方案 https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/ 对旧的actix-web版本的一个非常好的修复。从我可以找到的请求中,不再有CPU池。

1
如何启用Rust的“板条箱功能”?
我正在尝试使用rand::SmallRng。该文件说 此PRNG具有特征门控:要使用,必须启用crate功能small_rng。 我一直在搜索,但不知道如何启用“板条箱功能”。这个词甚至在Rust文档中的任何地方都没有使用。这是我能想到的最好的方法: [features] default = ["small_rng"] 但是我得到: 功能default包括small_rng既不是依赖项也不是其他功能 文档是否错误,或者我缺少什么?

2
转换产生无效指针的函数引用?
我正在跟踪第三方代码中的错误,并将其缩小到类似的范围。 use libc::c_void; pub unsafe fn foo() {} fn main() { let ptr = &foo as *const _ as *const c_void; println!("{:x}", ptr as usize); } 在稳定的1.38.0上运行,这会打印函数指针,但是beta(1.39.0-beta.6)和夜间返回'1'。(游乐场) _推断出什么,为什么行为发生了变化? 我认为正确的方法只是foo as *const c_void,但这不是我的代码。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.