问题标签 [borrowing]

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 投票
1 回答
266 浏览

vector - 如何从可变向量中克隆最后一个元素,然后将值推送到 Rust 中的向量?

如何从可变向量中克隆最后一个元素,然后将值推送到 Rust 中的向量?

错误是

我已阅读尝试过

并且

但仍然失败。

.cloned()尚未实施Root<T>

有没有办法从可变向量中克隆最后一个元素,然后将值推送到 Rust 中的向量?还是我应该Cloned先实现这个特征?

0 投票
1 回答
101 浏览

rust - 编译器通过禁止分配给借来的值来防止什么灾难?

来自Rust 编程 (PDF)的示例:

编译器不允许这样做:

但假设确实如此;怎么回事

现在p&String, 指向我们选择的 int 内存!

是坏事吗?

0 投票
1 回答
1351 浏览

reference - 为什么我可以只将不可变引用传递给 BufReader,而不是可变引用?

我正在编写一个简单的基于 TCP 的回显服务器。当我尝试使用BufReaderandBufWriter读取和写入 aTcpStream时,我发现按值传递 aTcpStreamBufReader::new()移动它的所有权,因此我无法将它传递给 a BufWriter。然后,我在这个线程中找到了解决问题的答案:

这很简单并且有效。但是,我不太明白为什么这段代码有效。为什么我可以只传递不可变引用BufReader::new()而不是可变引用?

整个程序可以在这里找到。

更多细节

在上面的代码中,我使用了reader.read_line(&mut message). BufRead于是我打开了Rust 标准库中的源代码,看到了这个:

在这里我们可以看到它将 self (&mut BufReader在我的情况下可能是 a )传递给read_until(). 接下来,我在同一个文件中找到了以下代码:

在这一部分中,有两个地方使用了BufReader:r.fill_buf()r.consume(used). 我以为r.fill_buf()是我想看到的。因此,我去了BufReaderRust 标准库中的代码,发现了这个:

它似乎用于self.inner.read(&mut self.buf)self.inner. 然后,我们看一下 和 的BufReader结构BufReader::new()

从上面的代码中,我们可以知道这inner是一个实现Read. 就我而言,inner可能是&TcpStream.

我知道的签名Read.read()是:

它在这里需要一个可变引用,但我只借给它一个不可变引用。self.inner.read()当程序到达时,这应该是一个问题fill_buf()吗?

0 投票
1 回答
997 浏览

iterator - Rust Inspect Iterator:不能将 `*` 作为不可变借用,因为它也作为可变借用

为什么我不能push在这个向量上inspectcontains这个过程skip_while

我已经为自己的结构实现了自己的迭代器,Chain如下所示:

take现在,当迭代器产生唯一值时,我想做什么。所以我正在inspect处理链并推送到一个向量,然后在一个take_while范围内检查它:

然而,Rust 编译吐出这个错误:

显然我不明白“借”的概念。我究竟做错了什么?

0 投票
2 回答
836 浏览

rust - 将借来的值嵌入到枚举中?

我在使用以下代码时遇到困难:

播放链接

HelloPhrase是一种语言实现的特征,英语、俄语等。Phrases是一个管理器结构,它可以有许多语言到短语的映射。这是一个人为的示例,但您可以将其视为事件管理器(即,获取 X 输入的事件处理程序),或 HTTP 处理程序和路由器。

话虽如此,我很难理解如何借用 a 的所有权将HelloPhrase其归还给调用者。运行它,返回以下错误:

我试过添加:

播放链接

这会导致以下错误:

我在为枚举添加生命周期时遇到了麻烦——理论上我希望返回值的Phrases生命周期是结构的生命周期——但到目前为止,生命周期语法对我来说相当混乱。总结为两个问题:

  1. 如何添加生命周期GetHelloResult来满足这个错误?
  2. 基于 Rust 的所有权规则,我试图用 Rust 做一个反模式吗?对于这样的事情,什么可能是更好的设计?

根据文档,我知道如何在结构上使用生命周期,但我不知道如何为枚举添加生命周期(语法方面)。我只提到了结构生命周期,因为我认为这是一个缺失的部分,但老实说我不知道​​。此外,如果我向 struct 和 impl 添加生命周期并尝试将其添加到hello_phrases地图中,我会收到错误消息

0 投票
2 回答
539 浏览

rust - 我应该如何重组我的图形代码以避免“不能一次多次借用变量作为可变变量”错误?

我有一个成功编译的简单图表:

但是当我使用它时它无法编译:

错误:

我见过所有类似的问题。我知道这是失败的,因为方法Graph::add_node()使用&mut self. 在所有类似的问题中,一般的答案是“重组你的代码”。我不明白我该怎么办?我应该如何重构这段代码?

0 投票
2 回答
428 浏览

rust - RefCell的循环引用在遍历中借用

我正在学习 Rust 并尝试编写双向链表。但是,我已经陷入了典型的迭代遍历实现中。我的印象是借用检查器/删除检查器过于严格,当它从RefCell. 我需要重复设置一个变量绑定(curr在这种情况下)来借用它的当前内容:

编译器抱怨:

没有 NLL

使用 NLL

我真的很感激这个问题的迭代解决方案非递归)。

0 投票
1 回答
138 浏览

rust - Can I reset a borrow of a local in a loop?

I have a processing loop that needs a pointer to a large lookup table. The pointer is unfortunately triply indirected from the source data, so keeping that pointer around for the inner loop is essential for performance.

Is there any way I can tell the borrow checker that I'm "unborrowing" the state variable in the unlikely event I need to modify the state... so I can only re-lookup the slice in the event that the modify_state function triggers?

One solution I thought of was to change data to be a slice reference and do a mem::replace on the struct at the beginning of the function and pull the slice into local scope, then replace it back at the end of the function — but that is very brittle and error prone (as I need to remember to replace the item on every return). Is there another way to accomplish this?

0 投票
1 回答
848 浏览

rust - 合并两个向量时匹配时“使用移动值”

我正在为带有计数的标签向量编写合并函数,但出现借用错误。

给出错误:

和类似的错误v2。它通常显示问题位置和导致问题的先前移动,但此处不显示。

我尝试了许多排列,并且通过以下更改我已经编译它,但我对所有的克隆和重新创建元组和重新创建Options 不满意。

添加我真正想写的内容以供参考,以防有人正在为借阅检查器寻找挑战:

请注意,匹配(v1, v2)应移动值,以便强制每个路径设置v1v2。仍然不如 Haskell 干净,但更接近。

0 投票
2 回答
4181 浏览

reference - 将自引用传递给包含对象的函数

我正在尝试了解 Rust 的所有权模型。在结构上调用函数时,我试图传递对包含对象的引用。

这是我的结构:

如您所见,receive期望引用一个App对象。

上面的代码给了我“使用部分移动的值:self”。这是有道理的,因为App具有移动语义,因此在调用时将值移动到sender函数中。

如果我更改它以便取而代之sender的是引用self,我会得到“无法移出借用的内容”,这也是有道理的,因为我们在self进入sender函数时已经借用了引用。

那我该怎么办?我理解为什么我不能存储对Appinside的引用Player,因为这会导致双重链接结构。但是我应该可以借用一个引用并对其执行操作,不是吗?

我在官方教程中找不到答案。

我通过selfreceive. 但是,如果我想app在 中可变receive怎么办?我不能self作为可变的传入,sender因为我也在借用player可变的。