lifetime 相关问题

变量的生命周期是变量绑定到特定内存位置的时间。生命时间在分配变量时开始,在解除分配时结束。

从特征方法返回特征对象时无法推断适当的生命周期

我正在尝试制作类似不可变字典特征的东西,可以在不影响以前版本的情况下添加新项目(引用)并使用它。最小的例子: #[派生(克隆)] 酒吧街...

回答 1 投票 0

具有 Boxed 异步回调类型字段的结构的生命周期必须比“static”长

{ f: 盒子 销钉 我有这个最小的例子: use std::{future::Future, pin::Pin, thread::JoinHandle, fmt::Debug}; use tokio::runtime::Runtime; struct Callback<E> { f: Box<dyn Fn() -> Pin<Box<dyn Future<Output = Result<(), E>> + Send + Sync>> + Send + Sync>, } trait Provider { fn setup(&self) -> JoinHandle<()>; } enum Foo { A, B } trait IntoFoo { fn into_foo(&self) -> Foo; } impl<E: Debug + IntoFoo> Provider for Callback<E> { fn setup(&self) -> JoinHandle<()> { std::thread::spawn(move || { // Running async function sycnhronously within another thread. let rt = Runtime::new().unwrap(); rt.block_on(handle(Box::new(move || (self.f)()))) .expect("request loop failed") }) } } async fn handle<E: Debug + IntoFoo + 'static>( callback_fn: Box<dyn Fn() -> Pin<Box<dyn Future<Output = Result<(), E>> + Send + Sync>> + Send + Sync>) -> Result<(), E> { perform(Box::new(move || (callback_fn)())).await } pub async fn perform< E: Debug + IntoFoo>( op: Box<dyn Fn() -> Pin<Box<dyn Future<Output = Result<(), E>> + Send + Sync>> + Send + Sync>, ) -> Result<(), E> { (op)().await } 这是一些真实代码的简化版本,我基本上必须在结构内部传递异步回调。该回调通过多个函数传递。其中之一在新生成的线程中调用该函数。 当调用 handle 时,我得到的错误出现在线程生成代码中。 错误是: error: lifetime may not live long enough --> src/indexer/callback.rs:41:41 | 27 | fn bootstrap(&self, input: StageReceiver) -> BootstrapResult { | - let's call the lifetime of this reference `'1` ... 41 | rt.block_on(handle_event(input, Box::new(move |ev: &Event| (self.f)(ev)), &retry_policy, utils)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cast requires that `'1` must outlive `'static` 我应该如何安排这个?愿意更改结构字段类型和任何类似的内容。但我必须注意:这个函数必须能够被多次调用(它可能位于handle中的循环内)。 其他一些线程建议在 Box 中传递异步回调,其结果是固定的装箱特征对象。这就是我尝试这个系统的原因。 您不能在新线程中使用非 'static &self 引用。 一种选择是使用 Arc 而不是 Box,然后克隆它: use std::{fmt::Debug, future::Future, pin::Pin, sync::Arc, thread::JoinHandle}; use tokio::runtime::Runtime; struct Callback<E> { f: Arc<dyn Fn() -> Pin<Box<dyn Future<Output = Result<(), E>> + Send + Sync>> + Send + Sync>, } trait Provider { fn setup(&self) -> JoinHandle<()>; } enum Foo { A, B, } trait IntoFoo { fn into_foo(&self) -> Foo; } impl<E: Debug + IntoFoo + 'static> Provider for Callback<E> { fn setup(&self) -> JoinHandle<()> { let f = Arc::clone(&self.f); std::thread::spawn(move || { // Running async function sycnhronously within another thread. let rt = Runtime::new().unwrap(); rt.block_on(handle(f)).expect("request loop failed") }) } } async fn handle<E: Debug + IntoFoo + 'static>( callback_fn: Arc< dyn Fn() -> Pin<Box<dyn Future<Output = Result<(), E>> + Send + Sync>> + Send + Sync, >, ) -> Result<(), E> { perform(callback_fn).await } pub async fn perform<E: Debug + IntoFoo>( op: Arc<dyn Fn() -> Pin<Box<dyn Future<Output = Result<(), E>> + Send + Sync>> + Send + Sync>, ) -> Result<(), E> { op().await } 您可以在较少的地方使用 Arc,并通过将回调包装在其自己的函数中并将其框起来,使用 Box 代替(如果您有需要使用的现有 API)。

回答 1 投票 0

函数返回的字符串文字的生命周期

考虑以下代码: const char* someFun() { // ...一些东西 返回“一些文字!!” } int main() { { // 块:A const char* retStr = someFun(); // 使用 retStr } } 在

回答 5 投票 0

只要进程处于活动状态,const char* 文字字符串就会持久存在吗?

我有如下功能: const char* get_message() { return "这是一条恒定的消息,不会永远改变!"; }; const char* get_message2() { 返回“消息...

回答 4 投票 0

我可以在 Rust 中修改结构体实例上的 &'a str ,使其在修改后具有相同的 &'a str 生命周期吗?

结构测试<'a> { 名称:&'a str } 实现<'a>测试<'a> { fn 修改名称(&'a mut self) { let new_name = self.name.replacen("az", "", 1); ...

回答 1 投票 0

只要进程处于活动状态,指向字符串文字的 const char* 是否就持久存在?

我有如下功能: const char* get_message() { return "这是一条恒定的消息,不会永远改变!"; }; const char* get_message2() { 返回“消息...

回答 2 投票 0

只要进程处于活动状态,const char* 字符串就会持久存在吗?

我有如下功能: const char* get_message() { return "这是一条恒定的消息,不会永远改变!"; }; const char* get_message2() { 返回...

回答 2 投票 0

我在使用此音频库理解 Rust 生命周期时遇到问题

我有多年的编程经验,但我对 Rust 很陌生。在理解如何在特定场景中使用引用时遇到问题,而编译器却没有告诉我我做错了。 继续...

回答 1 投票 0

在生命周期内将非静态可变引用转换为范围内的静态可变引用

以下代码(playgroung)适用于 miri,但它是否没有未定义的行为? 使用 std:: 线程; fn f1(x: &'static mut f64) { *x += 1.0; } fn f2(x: &'static mut f64) { *x *= *x...

回答 1 投票 0

问题生成 serde_json 读入`Vec<T>`(rust)

我有几个 JSON 文件,它们在顶层只是具有不同类型数据的数组,因此最好有一个函数以通用方式处理此问题。 这就是我到目前为止所拥有的...

回答 1 投票 0

在 Rust 中,Box:ed 结构与普通结构相比,其放置顺序是否有差异?

以下代码无法编译: 结构参考<'a> { nbr: &'a u32, } fn 函数<'a>() { 让nbr:u32 = 42; 让 _a_ref: Box> = Box::new(Ref { nbr: &...

回答 1 投票 0

在 Rust 中使用“静态生命周期”声明 Vec 失败

我正在学习 Rust(具有 C++ 背景),并努力声明具有静态生命周期的向量。 基本上,我尝试过... 让 v : '静态 Vec = vec![1, 2, 3]; ...但获得终生

回答 1 投票 0

根据C++标准,这种对临时的访问是否安全?

我最近在 C++ 代码库中发现了以下代码模式,我现在想知道根据 C++ 标准它是否安全。 (真正的代码通过几个有趣的方式传递了const char*指针...

回答 1 投票 0

Rust 如何在不使用函数的情况下检测对局部变量的引用?

假设函数返回对局部变量的悬空引用: fn foo<'a>() -> &'a i32 { 让我= 2; &我 } fn 主() { } Rust 注意到了这一点并引发了一个错误。 我的问题...

回答 1 投票 0

通过 const 指针而不是 const 引用传递临时值;这个解决方法格式正确吗?

所以显然,根据 C++ 标准,不能将 const 指针传递给临时变量作为函数的参数,而传递 const 引用则完全没问题,尽管两者都可以

回答 1 投票 0

为什么类似 Deref 的特征不能组合?

在此代码中,MyDeref 与标准库中 Deref 的定义匹配,MemoryView(从更复杂的示例简化而来)也几乎如此。 酒吧特质 MyDeref { 输入目标:?S...

回答 1 投票 0

上一次迭代中的可变借用,或者可能是终生问题?

我的代码无法编译,我不明白为什么。这是一个简化的、人为的版本: 结构体<'a> { 切片:&'a [u8], } 结构 ThingGetter { 缓冲...

回答 1 投票 0

rustc 无法推断特征实现中的生命周期

我有以下代码: 无论如何使用; 结构内部值; 枚举值{ 整数(i32), 其他(内在价值), } 为 &InnerValue 实现 TryFrom<&Value> { 类型错误=无论如何::错误;...

回答 1 投票 0

如何使用BufReader的fill_buff并通过TcpStream进行消费

以下代码无法编译 使用 std::io::{BufRead, BufReader}; 使用 std::net::{TcpListener}; fn 主() { 让侦听器 = TcpListener::bind(format!("0.0.0.0:{}", 7007)).unwrap()...

回答 1 投票 0

在循环中调用使用 `&mut self.0` 的函数 (E0499)

我正在寻找一种方法来解决这种特定情况下缺乏波洛尼乌斯的问题。据我目前的理解,其他答案似乎不适用。 我有两个结构,来源...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.