lifetime 相关问题

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

Rust 返回集合中的对象,其生命周期比集合本身短

我本质上试图使用 HashSet 创建堆分配对象的缓存。我的想法是我有一个包装字节引用的结构,并且在创建新对象时,我检查字节是否...

回答 1 投票 0

返回字符串如何修复无法返回引用临时值的值

我想在返回之前过滤 debug_args 函数中的消息: 酒吧特征 MyLog { fn debug_args(&self) -> &dyn std::fmt::Debug; } pub 结构 TracingMyLog<'a> { 记录:&...

回答 2 投票 0

“借用时临时值下降” - 如何使用路径列表引用?

我想将列表(Vec 或数组)作为函数参数发送到(异步)函数。每个路径都用于生成一个线程,该线程对该文件执行某些操作。 问题是,我找不到

回答 1 投票 0

为什么 const 生命周期省略不适用于 struct impl 中的 slice?

以下生命周期省略有效: 结构X; 隐式 X { const ONE: &str = "一"; } 为什么以下不起作用? 结构X; 隐式 X { 常量二:&[&str] = &[&...

回答 1 投票 0

创建具有足够生命周期的切片切片

我有一个函数 foo ,它接受参数数组切片的数组切片,但是我似乎无法创建一个寿命足够长的变量来将其作为参数传递: fn 主() { 让穆特出去...

回答 3 投票 0

DAPR 演员一生 - 优雅停止

假设我有一个 DAPR actor 实现,它涵盖了在单线程循环中实现的长时间运行的操作。演员有两个职责: 当演员创造时 - 它也创造...

回答 1 投票 0

尝试终生重用 Vec 时如何取悦借用检查员

我在 Rust 中遇到的一个常见模式是这样的: 结构 Foo { /*...*/ } 结构FooProcessor { foos: Vec<&'??? mut Foo>, // 这个生命周期是问题,请参阅解释...

回答 1 投票 0

基于范围的 for 循环中 range-init 的生命周期是多少?

在最新的 C++ 标准中,它意味着: 对于(富:酒吧) 巴兹; 相当于: { 自动 && r = 栏; for ( auto it = r.begin(), end = r.end(); it != end; ++it ) { ...

回答 2 投票 0

std::construct_at 使用 std::byte / unsigned char 数组中的内存

使用 std::byte / unsigned char 数组和 std::construct_at 来提供存储是一个非常常见的示例。 //假设A是一个非标准布局类用户定义类 alignas(A) std::byte st...

回答 1 投票 0

Azure 函数 - 在全局每个日志语句中添加 InitationId

我正在编写一个Azure函数,我想记录当前正在执行的函数的invocationId与日志消息一起记录。我有一个 CustomLogger 类,利用 dotnet 的 ILogger 接口...

回答 1 投票 0

了解 Rust 的 Trait 对象和不同函数签名中的生命周期注释

我正在研究 Rust 中的 Traits 和 Trait 对象。在 Trait 章节中,我以与编译器建议不同的方式解决了第六个练习。以下代码定义了两个结构体(Sheep 和 Co...

回答 1 投票 0

为什么生命周期省略对于返回 Fn 的函数不起作用?

根据 The Rust Book,终身省略允许我们拥有这个签名: fn first_word(s: &str) -> &str { ... } 而不是这个更详细的版本: fn 第一个单词<'a>(s: &a...

回答 1 投票 0

装箱特征如何影响传递给它的参数的生命周期? (有一个非常具体的例子)

这是一个非常简单但具体的示例,它会产生我无法理解的编译错误: 使用 std::path::Path; 特质 MyTrait { fn my_func(&self, t: T); } 结构 MyImpl {}...

回答 1 投票 0

如何使用 dyn 类型别名将生命周期参数添加到 Box<>

我有一个 Fn 特征的类型别名,例如 type SomeSub = dyn for<'a> Fn(&'a str) -> &'a str;我想与像 Box 这样具有明确生命周期的 Box 一起使用 我有一个 Fn 特征的类型别名,如 type SomeSub = dyn for<'a> Fn(&'a str) -> &'a str;,我想将其与具有显式生命周期的 Box 一起使用,如 Box<SomeSub + 'b>。不幸的是这不能编译: type SomeSub = dyn for<'a> Fn(&'a str) -> &'a str; struct SomeBuilder(pub usize); impl SomeBuilder { // --> this gets rejected with "type aliases cannot be used as traits" fn get_closure<'o>( &'o self ) -> Box<dyn SomeSub + 'o> { Box::new(|s| &s[self.0..]) } // This works, but duplicates the code of the type alias fn get_closure_long<'o>( &'o self ) -> Box<dyn for<'a> Fn(&'a str) -> &'a str + 'o> { Box::new(|s| &s[self.0..]) } } 第二种方法 get_closure_long() 编译时,get_closure() 会导致错误: error[E0404]: expected trait, found type alias `SomeSub` --> src/lib.rs:8:18 | 8 | ) -> Box<dyn SomeSub + 'o> { | ^^^^^^^ type aliases cannot be used as traits 像 dyn 一样省略 -> Box<SomeSub + 'o> 将被拒绝,并显示“类型别名不能用作特征”。使用 Box<SomeSub> 工作机器人不允许闭包捕获任何引用。 将闭包类型别名与 Box 以及该框的显式生命周期相结合的正确方法是什么? 您可以使类型别名通用: type SomeSub<'b> = dyn for<'a> Fn(&'a str) -> &'a str + 'b; 那么 SomeSub<'o> 是一个包含生命周期的有效类型,因此可以编译: fn get_closure<'o>(&'o self) -> Box<SomeSub<'o>> { Box::new(|s| &s[self.0..]) } 游乐场

回答 1 投票 0

当我尝试修改向量的最后一个元素时出现借用错误[关闭]

我正在尝试通过做 thing[thing.len() - 1] = other_thing; 来修改 Vec。我收到一条错误消息,告诉我我首先借用了一个可变引用,然后又借用了一个不可变引用。我找不到

回答 1 投票 0

具有生命周期的 Rust iter-map-collect 模式

我正在尝试实现我经常使用的 Vec.iter().map(...).collect() 模式的快捷方式。乍一看,这并不难: pub 特征 IterMap { fn 地图收集 我正在尝试实现我经常使用的 Vec.iter().map(...).collect() 模式的快捷方式。乍一看,并不难: pub trait IterMap<T> { fn mapcollect<F, U>(&self, f: F) -> Vec<U> where F: Fn(&T) -> U; } impl<T> IterMap<T> for Vec<T> { fn mapcollect<F, U>(&self, f: F) -> Vec<U> where F: Fn(&T) -> U, { self.iter().map(f).collect() } } 对于简单的案例来说,它就像一个魅力: let v = vec![5; 5]; let v_2 = v.mapcollect(|x| x * x); 但是,如果涉及生命周期,它就会崩溃: let v: Vec<Vec<i32> = ...; // define 2D-vector here let v_slice: Vec<&[i32]> = v.mapcollect(|x| x.as_slice()); 原因是 Rust 无法通过我的 v_slice 抽象将 v 的生命周期与 mapcollect() 的生命周期联系起来。 当然,我可以使用适当的生命周期注释来实现另一个mapcollect_with_lifetime(...),但这种方法有几个缺点。有没有办法帮助 Rust 自动计算出生命周期,就像原来的 iter().map(...).collect() 那样? 您根本不需要第二次实现,您可以使用单个正确实现的特征和实现来完成此操作。这是因为将生命周期添加到您的实现中是您如何帮助 rust 自动为调用者计算出这一点。 pub trait IterMap<'a, T: 'a> { fn mapcollect<F, U>(&'a self, f: F) -> Vec<U> where F: Fn(&'a T) -> U, U: 'a; } impl<'a, T: 'a> IterMap<'a, T> for Vec<T> { fn mapcollect<F, U>(&'a self, f: F) -> Vec<U> where F: Fn(&'a T) -> U, U: 'a, { self.iter().map(f).collect() } } fn main() { let v = vec![5; 5]; let v_2 = v.mapcollect(|x| x * x); let v: Vec<Vec<i32>> = vec![vec![1, 2, 3], vec![4, 5, 6]]; let v_slice: Vec<&[i32]> = v.mapcollect(|x| x.as_slice()); }

回答 1 投票 0

删除缓冲区后,通过 glVertexArrayVertexBuffer 附加到 VAO 的缓冲区会发生什么?

我正在使用OpenGL4.5,并尽可能使用直接状态访问。我围绕 VAO 和缓冲区对象编写了基本包装器。我正在使用 glVertexArrayVertexBuffer 将缓冲区绑定到 VAO。我想知道...

回答 1 投票 0

临时对象的生命周期[重复]

下面的代码工作正常,但是为什么这个代码是正确的呢?为什么 foo() 返回的临时变量的“c_str()”指针有效?我想,当 bar() 为

回答 2 投票 0

完整表达边界和临时变量的生命周期[重复]

可能的重复: 临时函数参数的生命周期是多长? 临时对象什么时候被销毁? 据说临时变量在评估的最后一步被销毁......

回答 2 投票 0

临时函数参数的生命周期是多长?

当创建 MyClass 的新实例作为函数的参数时,如下所示: 我的班级 { MyClass(int a); }; myFunction(MyClass(42)); 标准是否对时间做出任何保证

回答 4 投票 0

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