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

reference - Elegant way to borrow and return a mutable reference in Rust

I'm trying to return a mutable reference after doing some operation on it. This is best explained by a piece of code:

The play version is here. The workaround with boolean values is because I would be borrowing multiple times if I return Some(self) from within the match block. Is there an elegant way to implement the push function without using boolean values? If its possible to retain the function signature then its a bonus. Thank you!

0 投票
1 回答
931 浏览

reference - Rust 列表元素的多个所有者(列表所有者和多个引用者) - 可能吗?

我们有一个结构体LinkedList

XPipeline是所有XHandler对象的所有者,可以访问和修改它们。

我们已经有了处理程序列表;现在我们需要每个处理程序都可以引用列表中的邻居。也就是说,每个处理程序的方法可以引用处理程序的邻居,修改它们并调用它们的方法。

我的第一个想法是这样的:我为每个处理程序提供将引用邻居的字段prevnext通过在列表中添加一个新的处理程序,我用相应的引用初始化这些字段。现在我可以在所有处理程序的方法中使用这些引用。(在带有指针的 C++ 中这很容易)。

问题是:只允许一个所有者(即具有修改权限)。并且(所有处理程序的)所有者已经是一个XPipeline对象。我该如何解决?也许,通过雇用:

但具体如何?

0 投票
1 回答
1630 浏览

vector - 无法返回字符串切片向量:借来的值不够长

我是 Rust 的新手,我在使用借用检查器时遇到了一些问题。我不明白为什么这段代码无法编译。抱歉,如果这与先前回答的问题很接近,但我似乎无法在我查看的其他问题中找到解决方案。

我理解将本地字符串作为切片(&str)返回的相似性,但在这种情况下,它只是返回一个字符串,不足以让我对我试图返回向量的代码进行推理。据我了解,我试图返回对str在功能块末尾超出范围的类型的引用,所以我应该将该向量映射&str到向量String吗?我不太关心转换&strString. 首先,我只想让它工作。

这是代码,错误在lex函数中。

这是错误消息

我发现很难用这段代码来推理,因为以我对 Rust 的经验水平,我无法想象这些变量的生命周期。任何帮助将不胜感激,因为我花了一两个小时试图弄清楚这一点。

0 投票
1 回答
212 浏览

memory-management - 如何将 TcpStream 提供给 BufReader,然后将其取回?

我有一个结构:

用一个方法:

这很好用。这是一个 FTP 服务器,所以当我TcpStreamTcpListener::bind我那里得到一个新的服务器时:

start在我调用的那个方法里面:

果然,我在 FTP 客户端中看到了该消息。到目前为止,一切都很好。

但后来我这样做:

当我进入write_message循环内的下一个调用时:

不能*self作为可变借用,因为self.cstream也作为不可变借用 [E0502]

完整代码:

https://github.com/andrewarrow/tinted_pa​​radise/blob/169cc5f7025c417814f47a1fb3e3fc78ce4f9516/src/paradise.rs

https://github.com/andrewarrow/tinted_pa​​radise/blob/169cc5f7025c417814f47a1fb3e3fc78ce4f9516/src/starter.rs

我怎样才能改变周围的东西,以便我可以write_message在循环内调用?

0 投票
1 回答
1650 浏览

string - 如何将字符串传递给 HashSet 包含?

我想使用HashSet快速字符串查找,但我似乎无法找到一种方法将字符串变量传递给contains没有编译器错误。

这会导致此错误:

如果我尝试

然后我得到

我很难过,我需要做某种类型转换吗?

0 投票
2 回答
647 浏览

rust - 将结构的成员传递给 Rust 中相同结构的方法

我现在在 Rust 中面临一个借用问题,我有一个解决它的想法。但我认为我找到的方式不是一个好的答案。所以我想知道是否有另一种方法来解决它。

我使用以下示例代码来描述我的情况:

StructureS有一个方法 ,f2它需要一个额外的参数input来做某事。还有另一种方法 ,它使用of 结构f1调用。局外人可能会调用其中一个或用于不同的用例。f2valSf1f2

当我编译上面的代码时,我收到以下错误消息:

我大致了解 Rust 中的借用是如何工作的。所以我知道我可以通过将实现更改f1为:

但是,我觉得这个解决方案有点多余。我想知道是否有办法在不使用额外变量绑定的情况下解决这个问题。

0 投票
2 回答
61 浏览

functional-programming - Folding over references inside a match results in a lifetime error

I want to build a string s by iterating over a vector of simple structs, appending different strings to acc depending on the struct.

Running this code results in the following error:

The problem is that the lifetime of the &str I create seems to end immediately. However, if to_string() would have returned a &str in the first place, the compiler would not have complained. Then, what is the difference?

How can I make the compiler understand that I want the string references to live as long as I am constructing s?

0 投票
1 回答
2037 浏览

rust - 无法移出结构的借用内容

我正在尝试为通过套接字来自另一个程序的 BERT 数据实现反序列化器。对于以下代码:

当我尝试从传递的数据中读取字符串时,Rust 编译器会生成错误:

Deserializer<R>即使我的结构具有特征,我该如何解决这个问题Clone/Copy

0 投票
2 回答
16004 浏览

string - 为什么不鼓励接受对 String (&String)、Vec (&Vec) 或 Box (&Box) 的引用作为函数参数?

我写了一些以 a&String作为参数的 Rust 代码:

我还编写了引用 a Vecor的代码Box

但是,我收到了一些反馈,说这样做不是一个好主意。为什么不?

0 投票
0 回答
145 浏览

rust - 多次自借

我正在学习 Rust 并正在尝试编写一个简单的词法分析器。我next_token在一个impl块中有一个函数,它从输入字符迭代器中读取下一个标记。但是,由于多次借用 self ,代码将无法构建。我该如何解决这个问题?

我得到的错误:

错误[E0507]:无法移出借用的内容--> lexer.rs:110:20 | 110 | let literal = self.input.take_while(|&ch| { | ^^^^ 不能移出借来的内容

错误[E0500]:闭包需要唯一访问selfself.input已被借用--> lexer.rs:110:42 | 108 | 匹配 self.input.by_ref().peek() { | ---------- 借用发生在这里 109 | Some(c) if c.is_alphabetic() || *c == '_' => { // 标识符或关键字 110 | let literal = self.input.take_while(|&ch| { | ^^^^^ 闭包构造发生在这里 111 |
match self.input.peek() { | ---- 由于使用selfin 闭包而发生借用 ... 139 | } | - 借用在这里结束