问题标签 [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 回答
489 浏览

return - 为什么提前归还没有完成未偿还的借款?

我正在尝试编写一个函数,该函数仅在元素大于向量中已经存在的最后一个元素时将元素推到排序向量的末尾,否则返回错误,并带有对最大元素的引用。据我所知,这似乎没有违反任何借用规则,但借用检查器不喜欢它。我不明白为什么。

为什么这不起作用?


回应Paolo Falabella 的回答

我们可以将任何带有 return 语句的函数转换为没有 return 语句的函数,如下所示:

进入

由此,很明显,借用超出了 的范围'inner

为了借用检查而使用以下重写有什么问题吗?

考虑到 return 语句可以防止之后发生任何可能违反借用规则的事情。

0 投票
1 回答
211 浏览

hashmap - 不能将变量借用为可变的,因为在构建自引用 HashMap 时它也被借用为不可变的

我正在尝试建立一个自我参照HashMap

我遇到了借用检查器错误,但我不明白它的来源——是我更新HashMap错误的方法,还是我对它的自我引用使用?

错误:

0 投票
1 回答
294 浏览

rust - 惯用地以可变和不可变的方式访问向量的元素

您将如何以需要对所述向量的不可变引用来确定您需要如何改变向量的方式来改变向量?例如,我有一段看起来像这样的代码,我想复制向量的最后一个元素:

0 投票
2 回答
421 浏览

rust - 如何解决 RefCell 问题?

我有一个带有两个 C 指针和一个 Rust 的结构HashMap

我的结构被处理为一个Rc<RefCell<MyStruct>>,我有一个像这样调用的 C 函数:

C 有一个 Rust 回调,它在执行过程中被调用c_call,需要 a my_struct.borrow_mut(),但my_struct已经借用了c_call哪个需要p1p2,所以我得到RefCell<T> already borrowed.

问题是c_call无法更改,它需要不可变访问p1p2一些borrow_mut.my_struct

这是一个 MCVE:

游戏围栏

我该如何解决这个问题?

0 投票
0 回答
23 浏览

rust - 借用问题返回 &format!在模式中

我正在尝试返回format!模式匹配后的结果enum

但这不起作用:borrowed value does not live long enough

我该如何解决这个问题?

0 投票
1 回答
5397 浏览

rust - 在 Rust 中结束可变借用的选项有哪些?

我正在努力使用借阅检查器 - 奇迹o'奇迹。

虽然我通过添加块找到了解决方案,但我很好奇是否还有其他方法可以结束可变借用,以便下一条语句可以在之后访问绑定。

这是我到目前为止所做的:

我在对象的绑定周围包裹了一个块CanvasRenderer,在改变画布和范围结束后,CanvasRenderer模具和我的可变借用canvas可以被读取或其他任何东西。

这行得通 - 但现在我想看看其他解决方案!

我听说过,drop(stuff)但它没有按我认为的那样工作。

0 投票
2 回答
484 浏览

iterator - 如何在迭代向量时改变向量中的另一个项目,而不是向量本身?

我很清楚,迭代向量不应该让循环体任意改变向量。这可以防止迭代器失效,这很容易出现错误。

然而,并不是所有的突变都会导致迭代器失效。请参见以下示例:

这样的突变不会使 的迭代器无效my_vec,但它是不允许的。它可能会使对特定元素的任何引用无效,my_vec[some_index]但无论如何我们都不会使用任何此类引用。

我知道这些问题很常见,我不要求解释。我正在寻找一种方法来重构它,以便我可以摆脱这个循环。在我的实际代码中,我有一个巨大的循环体,除非我很好地表达这一点,否则我无法对其进行模块化。

到目前为止我的想法是:

  1. 用 包裹向量Rc<RefCell<...>>。我认为这在运行时仍然会失败,因为RefCell迭代器会借用它,然后当循环体尝试借用它时会失败。
  2. 使用临时向量来累积未来的推送,并在循环结束后推送它们。这没关系,但需要比动态推送更多的分配。
  3. 不安全的代码,并弄乱了指针。
  4. Iterator文档中列出的任何内容都无济于事。我检查了itertools,它看起来也无济于事。
  5. 使用while循环和索引,而不是使用使用对外部向量的引用的迭代器。这没关系,但不允许我使用迭代器和适配器。我只想摆脱这个外循环并使用my_vec.foreach(...).

是否有任何习语或任何库可以让我很好地做到这一点 不安全的函数只要不暴露指向我的指针就可以了。

0 投票
0 回答
54 浏览

rust - 为什么 Rust 借用检查器会忽略 drop()?

以下代码无法编译:

错误信息:

借用检查器显然是正确的。解决此问题的一种方法是使用显式范围,以便删除包装器,释放借用的包含对象。

这可以正确编译。

使对象超出范围的另一种方法是使用std::mem::drop函数。在这种情况下,它不起作用:

借用检查器抱怨与以前相同的错误消息。

drop(w)借来的为什么不免费c

0 投票
3 回答
780 浏览

pointers - 将一对数组传递给函数时,没有为类型“&A”实现特征

我正在尝试编写set调用 Rust LMDB 库文档)的函数,以及我正在处理的一个示例

我这辈子都做不到。这是我目前的尝试:

其中set定义为:

这吐出以下错误:


我也试过db.set(id, note).unwrap();了,但这次我得到了:


我也尝试过类似的东西:

但这也不起作用......我不完全明白为什么。没有idnote有类型&str,不是str吗?

0 投票
1 回答
65 浏览

reference - 从 Option 中获取 &'a T>

恐怕这可能是非常基本的,但我自己无法弄清楚。我有这张地图:

这个向量:

我想将一个值插入HashMap到向量中,并将对同一项目的引用插入到向量中。我试过这样做:

但它得到这个错误:

我想我的问题归结为:如果我有一个Option<T<'a>>,我怎么能得到一个&'a T