borrow-checker 相关问题

借用检查器是指Rust编程语言使用的所有权概念的编译时分析。此标记应用于相关问题和错误。

在 Rust 中调用循环中的函数时,无法一次借用可变多次错误

我正在尝试使用我在 Rust 中创建的函数来提出一系列选择,供用户从中进行选择,然后从该选择中执行关联的函数。然而,它给了我一个比较...

回答 1 投票 0

在 Rust 中强制转换可变引用 -> 不可变引用 -> 可变引用是否有效

所以我知道将不可变引用转换为可变引用是UB。然而,如果不可变引用是从可变引用派生而来的,那么它是否仍然被认为是 UB,就像技术上的内存一样

回答 1 投票 0

如何最好地并行化修改同一 Rust 向量的多个切片的代码?

假设我们想要将向量的每个切片中的每个元素加倍(就地),其中切片由一系列对(开始、结束)位置定义。下面的代码表达了int...

回答 2 投票 0

为什么 Rust 的借用检查器在使用从方法返回的迭代器时会抱怨,而直接使用 Vec 的迭代器时却不会?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ba9255e504174afa0f31f20467caf0a9 考虑以下 Rust 程序 结构体 Foo { 酒吧:Vec, 巴...

回答 1 投票 0

特征的生命周期作为返回值

我想通过返回 impl 特征(如 create_trait() 中那样)来隐藏从 create 函数返回的实际实现。这怎么可能做到呢? 特质名称<'a> { fn 名字...

回答 3 投票 0

Rust:修改后返回不可变借用

在 Rust 中,我尝试更新缓存,然后返回结果。 fn cached_res(&mut self) -> &Vec { 如果 self.last_update.elapsed() >= REFRESH_RATE { self.a = do_somet...

回答 1 投票 0

如何避免在 Rust 中克隆大整数

我使用 num::BigUInt 类型来避免在计算数字的阶乘时出现整数溢出。 然而,我不得不求助于使用 .clone() 来通过 rustc 的借用检查器。 我怎样才能重构

回答 4 投票 0

使用 Rust 惯用的方法来获得具有单个向量项别名的特征向量是什么?

我目前正在为 Sway WM 开发一个小型状态栏。该栏由多个实现 Widget 特征的对象组成。 在所有小部件中,时钟有点特别。我不只是想要

回答 1 投票 0

Rust 借用检查器类比

作为一名学习 Rust 的 C++ 程序员新手,我对所有权以及借用检查器的工作原理并不完全满意,因此在尝试它时,我想到了一个我想询问的类比...

回答 2 投票 0

我可以可变地借用哈希映射条目,而哈希映射本身是不可改变地借用的吗?

我正在尝试迭代哈希图,并根据每个条目的内容对不同的条目进行更改。重要的是我永远不要更改我正在查看的条目。我认为我...

回答 1 投票 0

修改HashMap中的值,同时不可变地借用整个HashMap

我正在尝试通过在我的项目中使用 Rust 来学习它。 然而,我在一些代码中一直在与借用检查器作斗争,这些代码的形式与以下内容非常相似: 使用 std::

回答 2 投票 0

UnsafeCell 从函数获取可变引用:无法返回对临时值的引用

我正在尝试 UnsafeCell,这是一个示例: 使用 std::cell::UnsafeCell; fn get_ref_compile_error(cell: &UnsafeCell) -> &mut i32 { &mut 不安全 { *cell.get...

回答 2 投票 0

如何返回对Rc内部值的引用<RefCell<Node>>

我在 Rust 中有以下结构: 类型 NodePtr = Rc>; 结构节点{ 值:选项, 重量:使用, 高度:使用, 家长:选项 我在 Rust 中有以下结构: type NodePtr = Rc<RefCell<Node>>; struct Node { value: Option<String>, weight: usize, height: usize, parent: Option<Weak<RefCell<Self>>>, left: Option<NodePtr>, right: Option<NodePtr> } 我创建了特征 trait Access 和 trait TreeNode 并为 NodePtr 实现了它们。 trait Access { fn borrow_node(&self) -> Ref<Node>; fn borrow_node_mut(&self) -> RefMut<Node>; } trait TreeNode: Sized { fn is_leaf(&self) -> bool; fn set_left_child(&self, child: Option<Self>); fn set_right_child(&self, child: Option<Self>); fn contains_left(&self, line: usize, prev_lines: usize) -> bool; fn contains_right(&self, line: usize, prev_lines: usize) -> bool; fn find_node(&self, line: usize) -> Option<(Self, Side)>; fn insert_into(self, node: Self, placement: Side) -> Self; fn get_line(&self, line: usize) -> Option<&String>; } impl Access for NodePtr impl TreeNode for NodePtr 其中一种方法如下: fn find_node(&self, line: usize) -> Option<(Rc<RefCell<Node>>, Side)>; 此函数返回所需注释的 parent,并且 Side 枚举包含有关左子节点还是右子节点的信息(这样设计是为了使节点可以轻松替换)。 现在我遇到了麻烦。我似乎无法返回对节点包含的字符串的引用,从而导致内部数据实际上无法访问。 NodePtr的另一个方法是find函数: fn get_line(&self, line: usize) -> Option<Ref<String>> { if let Some((node, side)) = self.find_node(line) { let child = match side { Side::Left => Rc::clone(node.borrow_node().left.as_ref().unwrap()), Side::Right => Rc::clone(node.borrow_node().right.as_ref().unwrap()) }; return Some(Ref::map(node.borrow(), |n| n.value.as_ref().unwrap())); } None } 这就是我收到错误的地方: error[E0515]: cannot return value referencing local variable 'node' --> src\blahblah.rs:152:20 | 152 | return Some(Ref::map(node.borrow(), |n| n.value.as_ref().unwrap())); | ^^^^^^^^^^^^^^----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | | | 'node' is borrowed here | returns a value referencing data owned by the current function 而且我似乎无法找到一种方法来获取对任何形状或形式的拥有数据的引用。 什么可以工作,是返回一个选项>,但这很荒谬,而且我也不知道如何将 None 放入引用中。 非常感谢您的帮助。 我尝试以多种方式返回一个Option和一个Option<&String>,但都失败了。我无法通过借阅检查器。 你不能那样做。您已经陷入了使用 Rc<RefCell> 图表的缺点之一。 您可以做的关闭是返回整个节点,可能使用一些包装器只允许获取长度。 或者您可以使用一些允许您以类似于投影 Rc 的方式投影 RefCell 的库,例如 mappable-rc,但这仍然需要您更改方法的返回类型。 更好的方法是使用图形库,例如petgraph。

回答 1 投票 0

向异步发送可变引用不会在异步关闭后将其返回

有一个流,我想继续从异步函数(通过 tokio 生成)向其中发送数据包,直到我的主 fn 收到用户输入。然后包含生成的异步的运行时将被sh...

回答 1 投票 0

用问号替换 unwrap() 会导致借用检查器错误

我有一个计算器解析器代码设置如下: 结构解析器{ 当前索引:使用, 代币:Vec, } impl 解析器 { fn new(tokens: Vec) -> Self { 帕...

回答 1 投票 0

解开枚举变量并返回拥有的值或引用

假设我有一个具有两个变体的枚举,每个变体都包含不同类型的单个值 - 并且枚举在这两种类型上是通用的: 枚举 AorB { 一个(一个), 乙(乙), } 它

回答 1 投票 0

有没有一种方法可以优雅地解决“在可变引用后面移动”而不实现“复制”特征?

我正在尝试在 Rust 中实现合并排序的合并功能。问题是我试图对泛型类型 T 执行此操作,该类型仅受 std::cmp::PartialOrd 限制。 这是代码:...

回答 1 投票 0

如何在 Rust 中迭代 vec 并进行更改?

我正在尝试用 Rust 构建一个任务管理器来进行练习。 我想要一个存档的任务部分,所以这是我的任务管理器结构: pub 结构任务管理器 { 任务:Vec,

回答 1 投票 0

为什么我可以在引用上调用 File.take() ?

当我查看 File 的文档时,我发现 take 方法采用 self,而不是 &self。但我仍然可以在借用的引用上调用该方法: fn foo(文件:&文件) { 让 _ = file.take...

回答 1 投票 0

为什么我不能将捕获的变量移动到闭包中?

这段: 结构任务链 { } 实现任务链 { pub fn add_task(mut self, 工作: T, 参数: A) -> Self 在哪里 T: Fn(usize, A) + '静态, ...

回答 1 投票 0

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