借用检查器是指Rust编程语言使用的所有权概念的编译时分析。此标记应用于相关问题和错误。
尝试使用存储闭包实现迭代器时,令人困惑的 Rust 生命周期问题
我正在尝试编写一个在 &str 上工作的简单文本解析实用程序。我想实现一个接受闭包对象和分隔符字符串的函数,它返回一个实现
我正在使用 struct Node 和 node_map 定义为 pub 结构节点<'a> { 编号:i32, 下一个:HashMap>, } 让 mut node_map = HashMap:: 我正在使用 struct Node 和 node_map 定义为 pub struct Node<'a> { id: i32, next: HashMap<String, &'a Node<'a>>, } let mut node_map = HashMap::<i32, LexerNode>::new(); 我正在使用node_map,如下所示 let Some(node) = node_map.get_mut(&node_id) else { return Err("Invalid node_id".to_string()); }; // some logic to get edge_pairs for pair in edge_pairs { // some logic to get neighbour_id let Some(neighbour) = node_map.get(&neighbour_id) else { return Err("Invalid node_id".to_string()); }; node.next.insert(char.to_string(), neighbour); } 我收到错误 cannot borrow node_map as immutable because it is also borrowed as mutable immutable borrow occurs here [E0502] 指的是 node.next.insert 语句。我需要 node 能够 mut(能够插入新值)并且 neighbour 不能够mut。它给出了这个借用错误。我该如何解决这个问题?我不想使用 clone,因为我想要对节点的引用。 这是做不到的。 嗯,从技术上讲,this可以:如果edge_pair至少是一个数组,则可以使用get_many_mut()(可在夜间和hashbrown中使用)。如果没有,好吧,我不知道。但这并不重要。 你正在与不可避免的事情作斗争。您试图这样做,以便节点映射将包含一个引用,该引用包含一个引用,该引用包含一个引用...最终包含对存储在节点映射中的内容的引用。 这是完全不可能的。嗯,不是彻底的,有解决方案。但最好的解决办法是:不要。克隆你的方法来摆脱麻烦。 请参阅为什么我不能在同一结构中存储值和对该值的引用?了解有关自引用结构的更多信息。
我正在使用 struct Node 和 node_map 定义为 pub 结构节点<'a> { 编号:i32, 下一个:HashMap>, } 让 mut node_map = HashMap:: 我正在使用 struct Node 和 node_map 定义为 pub struct Node<'a> { id: i32, next: HashMap<String, &'a Node<'a>>, } let mut node_map = HashMap::<i32, LexerNode>::new(); 我正在使用node_map,如下所示 let Some(node) = node_map.get_mut(&node_id) else { return Err("Invalid node_id".to_string()); }; // some logic to get edge_pairs for pair in edge_pairs { // some logic to get neighbour_id let Some(neighbour) = node_map.get(&neighbour_id) else { return Err("Invalid node_id".to_string()); }; node.next.insert(char.to_string(), neighbour); } 我收到错误 cannot borrow node_map as immutable because it is also borrowed as mutable immutable borrow occurs here [E0502] 指的是 node.next.insert 语句。我需要 node 能够 mut(能够插入新值)并且 neighbour 不能够mut。它给出了这个借用错误。我该如何解决这个问题?我不想使用 clone,因为我想要对节点的引用。 这是做不到的。 嗯,从技术上讲,this可以:如果edge_pair至少是一个数组,则可以使用get_many_mut()(可在夜间和hashbrown中使用)。如果没有,好吧,我不知道。但这并不重要。 你正在与不可避免的事情作斗争。您试图这样做,以便节点映射将包含一个引用,该引用包含一个引用,该引用包含一个引用...最终包含对存储在节点映射中的内容的引用。 这是完全不可能的。嗯,不是彻底的,有解决方案。但最好的解决办法是:不要。克隆你的方法来摆脱麻烦。 请参阅为什么我不能在同一结构中存储值和对该值的引用?了解有关自引用结构的更多信息。
我目前正在用 Rust 编写一个解析器,我需要能够实习字符串文字和变量标识符。解析器应该借用一个 HashSet 来添加值,并返回带有
我制作了这个名为 Oracle 的 Rust 结构,它可以回答任何问题 /// Oracle是一个能够回答问题的智慧实体 pub 结构 Oracle { 来源:Rc, } 实现 Oracle {...
我正在创建一个具有两个字段的 struct App:一个字段包含一个拥有的窗口(此处简化为 u32),另一个字段包含一个最终应引用上面窗口的结构。然而,
我对管道的语义有点困惑 |匹配臂中的操作员。具体来说,我有一些代码,其中使用管道似乎会导致移动后使用借用检查器错误。 这是一分钟...
为什么 | (管道)在 Rust 模式匹配中会导致“移动后使用的值”?
编辑:事实上这是我的 IDE 的问题,而不是我的代码的问题。具体来说,这是 RustRover 的借用检查器中的一个错误(在 2024.1 和 2024.2 EAP 中)。 误报: 在 Rust 中,我有点困惑
我遇到了与这个问题中提到的相同的问题。简而言之,他的问题是借用一个可变的对象,因为它在闭包内使用,而借用它作为不可变的对象,因为它在闭包内使用......
将枚举转换为 Rust 中的另一个枚举,同时有选择地移动包含的值
我有两个这样的枚举: 枚举 E1 { A { val: SomeValue1 }, B(某个值2), C(某些值3), } 枚举 E2 { 一个, B(某个值2), C(某些值3), D、 乙 } 这里 SomeValueX 类型并不意味着...
我想将柴油异步板条箱中的数据库事务包装到一个通用连接对象中,该对象本身提供异步事务方法。不幸的是,无论我尝试借用检查器
为什么我不能移出对之后不再使用的拥有的 vec 的共享引用?
我想知道如果向量被拥有并且之后不被使用,为什么不可能移出对向量的共享引用? 我有一些代码看起来像这样: #[导出(调试)] 结构项目(
我正在尝试使用 wgpu 和 winit 用 Rust 编写一个渲染引擎库,并且一直在遵循“学习 WGPU”教程。不幸的是,一些不安全的代码(create_surface)在......
使用`&str`索引`HashMap<&String, V>`
使用 &str 索引 HashMap<&String, V> 的正确方法是什么? Rust 报告 &String 不是索引所需的 Borrow。 (这似乎有点傻...
使用 `&str` 从 `HashMap<&String, V>` 建立索引
使用 &str 索引 HashMap<&String, V> 的正确方法是什么? Rust 报告 &String 不是索引所需的 Borrow。 (这似乎有点傻...
为什么通过特征对象进行突变会失败,但通过函数指针进行突变却可以?
我有一个 Rust 程序,其中包含两个版本的结构及其方法实现。第一个版本使用函数指针,而第二个版本使用装箱特征对象。这是代码: 酒吧街...
Optional<String>的最佳借用访问器模式是什么?
这个 rust-analyzer 风格指南推荐了这样的访问器: 结构人{ // 不变式:永远不会为空 名字:字符串, middle_name:选项 } 隐含人{
Rust 中可选<String>的最佳借用访问器模式是什么?
这个 rust-analyzer 风格指南推荐了这样的访问器: 结构人{ // 不变式:永远不会为空 名字:字符串, middle_name:选项 } 隐含人{
我有一个结构,Thing 实现 Clone 但不实现 Copy,它有两种方法,一种用于工作,另一种用于从现有的“父”Thing 派生“子”Thing。不是...
Rust 认为参数是在 `impl Trait` 返回值中借用的,并抱怨“借用的值寿命不够长”
简化代码: 结构体A(/**/); 特质 Foo {} 特质栏{ fn 栏(a: &A) -> impl Foo; fn baz() -> impl Foo { 让 a = A(); 自我::酒吧(&a) } } 错误: 错误...