问题标签 [borrow-checker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
796 浏览

rust - 如何返回指向“寿命不够长”的拥有值的指针?

我有以下代码:

这个想法是图创建一个新节点并将其“借给”给调用该方法的人。但我不知道如何返回对新创建结构的引用。第二次返回工作正常,但显然无效。

如何在不从向量中取回节点的情况下返回节点?

0 投票
1 回答
111 浏览

rust - 使用特征作为类型参数时借用检查器失败

在结构中使用特征作为类型参数时,借用检查器出现问题:

输出是:

然而,以下示例有效:

这对我来说真的很奇怪,因为第二个示例只是第一个示例的实例化,我可能(痛苦地)用宏实现同样的事情。

我想这很棘手,因为我需要知道闭包所采用的参数类型,但我不需要存储这个引用......

这是借用检查器中的错误吗?还是我做错了什么?

编辑 1:精确用例

编辑 2:正如下面的答案所解释的,问题是借用检查器强制生命周期Observer<&mut Type>&mut Type对实际结构做同样的事情)。
所以在我的情况下,我可以通过Observer<Arg>这样定义来解决:

所以类型参数 Arg 本身不是一个引用,但这使得代码不那么通用。有人有更好的解决方案吗?

0 投票
1 回答
1011 浏览

rust - 如何为包含原始指针的结构强制执行生命周期?

编者注:此代码不再在 Rust 1.0 中编译并出现错误parameter `'a` is never used。此错误的原因正是由于下面演示的问题,因此(更新的)解决方案仍然适用。

此代码块引起了一些混乱:

为什么会这样编译?

当我打电话

它不应该有生命周期b吗?我预计会出现编译错误,因为生命周期'aMutPtr<'b, Bar>.

0 投票
1 回答
1559 浏览

rust - 在 Rust 中更改树中的节点

我正在尝试编写一个函数,该函数在给定树结构的情况下返回该树的副本,但在特定索引处更改了节点。这是我到目前为止所拥有的:

http://is.gd/YdIm0g

我似乎无法摆脱错误,例如:“不能将不可变的借用内容作为可变借用”和“无法移出借用的内容”。

我可以在原始树的基础上从头开始创建新树,并在此过程中更改一个节点。但我想了解如何用借用检查器赢得这场战斗。

0 投票
1 回答
6837 浏览

rust - 无法从 &mut self 借用文件(错误消息:无法移出借用的内容)

编译它会给我:

为什么会这样?我该怎么做才能解决它?

0 投票
1 回答
88 浏览

rust - 即使先前的借用被“忘记”也不能借用指针?

我不明白为什么函数fn1不能编译,即为什么 "let z = &mut x;" 无法分配,而先前存储在“y”中的引用不再使用(“y”被重新分配给其他东西)。

此外,为什么fn2fn3在“逻辑上”做同样的事情时都可以编译?

fn2实际上与fn1不同,“y”超出范围而不是重新分配,但这仅在“y”指针存储方面有所不同,与“y”指向的内容无关。

实际上, fn3与 fn1 不同 “z”是从“y”分配的,而不是直接从“&mut x”分配的。

0 投票
1 回答
82190 浏览

reference - 无法移出借用内容/无法移出共享参考

我不明白错误cannot move out of borrowed content。我收到了很多次,我总是解决它,但我一直不明白为什么。

例如:

产生错误:

在较新版本的 Rust 中,错误是

我通过克隆解决了它line

即使在阅读了其他帖子后,我也不明白这个错误:

这种错误的根源是什么?

0 投票
2 回答
4117 浏览

rust - 在 &mut self 方法中展开成员变量时无法移出借用的内容

我试图在 Rust 中创建一个不相交集数据结构。相关代码为:

我得到的错误是:

我不确定我是否完全理解借用检查器,但我使用引用来避免获取结构本身的所有权,以便可以像使用其他语言一样指向和重新分配它们。

我可以通过从结构中的引用中删除 来避免这些错误mut,但是我不能更改每个集合的父级,因为它们是不可变的。

我已经阅读了类似的问题,例如:

这些并不能帮助我弄清楚如何解决这个问题。我也尝试过重构函数find以及要使用的结构本身Rc<RefCell<Set>>Box<Set>但我总是以同样的错误告终。

这是什么错误,我该如何解决?

0 投票
1 回答
16112 浏览

reference - 尝试转移所有权时无法移出借用的内容

我正在编写一个链表来了解 Rust 的生命周期、所有权和引用。我有以下代码:

但我收到以下编译错误:

较新版本的 Rust 有一个稍微不同的错误:

我认为该head节点当前必须由 拥有self,这是链表。当我将其分配给 时new_node.next,可能会发生所有权变更。

如果可能的话,我宁愿不克隆该值,因为这似乎很浪费。我不想只是在函数期间“借用”它。我真的很想转让它的所有权。

我怎么做?

我已经看过在&mut self 方法中解包成员变量时无法移出借用的内容,以及无法移出借用的内容/无法移出共享引用的后面

我尝试按照其中一个问题中接受的答案中的建议删除匹配臂,并next在创建 new时进行定义LinkedListNode,但我收到了相同的错误消息。

我已成功添加了一个append方法,该方法需要将 aLinkedListNode添加到列表的末尾。

0 投票
2 回答
2537 浏览

rust - 创建 Vec 时,借用价值的寿命不够长

编者注:这个问题是在 Rust 1.0 之前提出的。从那时起,许多函数和类型发生了变化,某些语言语义也发生了变化。问题中的代码不再有效,但答案中表达的想法可能是有效的。

我正在尝试列出目录中的文件并将文件名复制到我自己的Vec. 我尝试了几种解决方案,但总是以无法创建足够长的生存变量而告终。我不明白我的错误。

为什么编译器会抱怨 "x" ?我不在乎 x,我想要&str它的内部,我认为它&str是静态的。

我尝试过这种方式,但我得到了相同的结果,编译器抱怨“路径”的寿命不够长。

这里是操场