问题标签 [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.
vector - 如何从可变向量中克隆最后一个元素,然后将值推送到 Rust 中的向量?
如何从可变向量中克隆最后一个元素,然后将值推送到 Rust 中的向量?
错误是
我已阅读并尝试过
并且
但仍然失败。
也.cloned()
尚未实施Root<T>
。
有没有办法从可变向量中克隆最后一个元素,然后将值推送到 Rust 中的向量?还是我应该Cloned
先实现这个特征?
reference - 为什么我可以只将不可变引用传递给 BufReader,而不是可变引用?
我正在编写一个简单的基于 TCP 的回显服务器。当我尝试使用BufReader
andBufWriter
读取和写入 aTcpStream
时,我发现按值传递 aTcpStream
会BufReader::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()
是我想看到的。因此,我去了BufReader
Rust 标准库中的代码,发现了这个:
它似乎用于self.inner.read(&mut self.buf)
从self.inner
. 然后,我们看一下 和 的BufReader
结构BufReader::new()
:
从上面的代码中,我们可以知道这inner
是一个实现Read
. 就我而言,inner
可能是&TcpStream
.
我知道的签名Read.read()
是:
它在这里需要一个可变引用,但我只借给它一个不可变引用。self.inner.read()
当程序到达时,这应该是一个问题fill_buf()
吗?
iterator - Rust Inspect Iterator:不能将 `*` 作为不可变借用,因为它也作为可变借用
为什么我不能push
在这个向量上inspect
做contains
这个过程skip_while
?
我已经为自己的结构实现了自己的迭代器,Chain
如下所示:
take
现在,当迭代器产生唯一值时,我想做什么。所以我正在inspect
处理链并推送到一个向量,然后在一个take_while
范围内检查它:
然而,Rust 编译吐出这个错误:
显然我不明白“借”的概念。我究竟做错了什么?
rust - 将借来的值嵌入到枚举中?
我在使用以下代码时遇到困难:
(播放链接)
HelloPhrase
是一种语言实现的特征,英语、俄语等。Phrases
是一个管理器结构,它可以有许多语言到短语的映射。这是一个人为的示例,但您可以将其视为事件管理器(即,获取 X 输入的事件处理程序),或 HTTP 处理程序和路由器。
话虽如此,我很难理解如何借用 a 的所有权将HelloPhrase
其归还给调用者。运行它,返回以下错误:
我试过添加:
和
(播放链接)
这会导致以下错误:
我在为枚举添加生命周期时遇到了麻烦——理论上我希望返回值的Phrases
生命周期是结构的生命周期——但到目前为止,生命周期语法对我来说相当混乱。总结为两个问题:
- 如何添加生命周期
GetHelloResult
来满足这个错误? - 基于 Rust 的所有权规则,我试图用 Rust 做一个反模式吗?对于这样的事情,什么可能是更好的设计?
根据文档,我知道如何在结构上使用生命周期,但我不知道如何为枚举添加生命周期(语法方面)。我只提到了结构生命周期,因为我认为这是一个缺失的部分,但老实说我不知道。此外,如果我向 struct 和 impl 添加生命周期并尝试将其添加到hello_phrases
地图中,我会收到错误消息
rust - 我应该如何重组我的图形代码以避免“不能一次多次借用变量作为可变变量”错误?
我有一个成功编译的简单图表:
但是当我使用它时它无法编译:
错误:
我见过所有类似的问题。我知道这是失败的,因为方法Graph::add_node()
使用&mut self
. 在所有类似的问题中,一般的答案是“重组你的代码”。我不明白我该怎么办?我应该如何重构这段代码?
rust - RefCell的循环引用在遍历中借用
我正在学习 Rust 并尝试编写双向链表。但是,我已经陷入了典型的迭代遍历实现中。我的印象是借用检查器/删除检查器过于严格,当它从RefCell
. 我需要重复设置一个变量绑定(curr
在这种情况下)来借用它的当前内容:
编译器抱怨:
没有 NLL
使用 NLL
我真的很感激这个问题的迭代解决方案(非递归)。
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?
rust - 合并两个向量时匹配时“使用移动值”
我正在为带有计数的标签向量编写合并函数,但出现借用错误。
给出错误:
和类似的错误v2
。它通常显示问题位置和导致问题的先前移动,但此处不显示。
我尝试了许多排列,并且通过以下更改我已经编译它,但我对所有的克隆和重新创建元组和重新创建Option
s 不满意。
添加我真正想写的内容以供参考,以防有人正在为借阅检查器寻找挑战:
请注意,匹配(v1, v2)
应移动值,以便强制每个路径设置v1
和v2
。仍然不如 Haskell 干净,但更接近。
reference - 将自引用传递给包含对象的函数
我正在尝试了解 Rust 的所有权模型。在结构上调用函数时,我试图传递对包含对象的引用。
这是我的结构:
如您所见,receive
期望引用一个App
对象。
上面的代码给了我“使用部分移动的值:self
”。这是有道理的,因为App
具有移动语义,因此在调用时将值移动到sender
函数中。
如果我更改它以便取而代之sender
的是引用self
,我会得到“无法移出借用的内容”,这也是有道理的,因为我们在self
进入sender
函数时已经借用了引用。
那我该怎么办?我理解为什么我不能存储对App
inside的引用Player
,因为这会导致双重链接结构。但是我应该可以借用一个引用并对其执行操作,不是吗?
我在官方教程中找不到答案。
我通过self
在receive
. 但是,如果我想app
在 中可变receive
怎么办?我不能self
作为可变的传入,sender
因为我也在借用player
可变的。