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

rust - 实现树形数据结构

我想实现一个树数据结构。我有一个Node结构并希望它保存对 childNode的引用。我试过了:

此代码无法编译:

我该如何实施?

0 投票
1 回答
84 浏览

rust - 价值希望为整个功能范围而存在

Rust 抱怨它的get_string寿命不够长。它似乎想在整个函数范围内保持活力,但我看不出这是怎么发生的。


0 投票
3 回答
2696 浏览

rust - 如何在处理数据流时有效地构建向量和该向量的索引?

我有一个结构Foo

我想处理一个数据流并将结果保存到该字段上并Vec<Foo>为此创建一个索引。Vec<Foo>Foo::v

我想使用 aHashMap<&str, usize>作为索引,键在哪里,&Foo::v值是 中的位置Vec<Foo>,但我愿意接受其他建议。

我想尽可能快地处理数据流,这不需要做两次明显的事情。

例如,我想:

  • String每个数据流读取只分配一次
  • 不要搜索索引两次,一次是检查键不存在,一次是插入新键。
  • 不要使用Rcor增加运行时间RefCell

借用检查器不允许此代码:

有多个问题:

  1. hash.entry借用钥匙,所以s必须有一个“更大”的生命周期hash
  2. 我想s在 (b) 行移动,而我在 (a) 行有一个只读引用

那么我应该如何在没有额外调用String::clone或调用HashMap::get后调用的情况下实现这个简单的算法HashMap::insert呢?

0 投票
2 回答
2607 浏览

reference - 为什么在闭包参数中使用“&&”?

关于这个例子,我有两个问题:

  1. 为什么&&x在闭包参数中使用而不仅仅是x?我知道这&是传递对对象的引用,但是两次使用它是什么意思?

    我不明白文档是怎么说的:

    因为find()需要一个引用,并且许多迭代器迭代引用,这会导致参数是双重引用的可能令人困惑的情况。您可以在下面的示例中看到这种效果,使用&&x.

  2. 为什么Some(&2)使用而不是Some(2)

0 投票
0 回答
33 浏览

rust - 向变量添加大括号如何防止它被匹配借用(拥有?)?

我试图理解Rust 中二叉树的实现,但我无法理解函数中的一些作用域魔法locate_mut

0 投票
1 回答
402 浏览

memory-management - 结构上的 getter 方法的 Rust 借用问题

我是 Rust 的新手,所以仍在尝试习惯该语言的内存模型。

cannot move out of borrowed content.因此,当我在结构上构建getter方法时遇到错误。我不太明白为什么会这样,但它似乎与枚举的某些特征有关。

我收到的错误消息与Enum性别有关。

我确保参考自我。我也没有在这些函数中进行任何分配——只是 getter 函数——但不知何故,借用变得一团糟。

0 投票
1 回答
2058 浏览

multithreading - 多个线程如何共享一个迭代器?

我一直在研究一个函数,它将使用 Rust 和线程将一堆文件从源复制到目标。我在让线程共享迭代器时遇到了一些麻烦。我还不习惯借阅系统:

我收到了我无法解决的编译错误:

我已经看到了以下问题:

当使用多个我不使用的线程时,值的寿命不够长chunks,我想尝试通过线程共享一个迭代器,尽管创建块以将它们传递给线程将是经典的解决方案。

无法在线程之间发送 &str 因为它的寿命不够长 我已经看到了一些使用通道与线程通信的答案,但我不太确定使用它们。应该有一种更简单的方法来通过线程共享一个对象。

为什么局部变量对于 thread::scoped 的寿命不够长 这引起了我的注意,scoped应该可以解决我的错误,但是由于它位于不稳定的通道中,我想看看是否有另一种方法可以使用spawn.

有人可以解释我应该如何修复生命周期以便可以从线程访问迭代器吗?

0 投票
0 回答
447 浏览

rust - Rust 中多重交叉引用的最佳方法是什么?

我正在将某些随机几何的蒙特卡罗模拟从 Python 转换为 Rust。我在 Python 中拥有的自由让我在整个代码中存储对其他对象的引用有点草率,但这似乎在 Rust 中实现起来更棘手。

在我当前的 Python 实现中,主要对象是Geometry. 它包含一个Vertex带有唯一 ID 的 es 字典(ID 也是它在字典中的查找键)和一个Triangles 字典(与 for 相同的场景Vertex)。EveryTriangle包含三个Vertexes 的列表(这次没有字典,这里是有序列表),并且 everyVertex包含它出现的所有 s 的字典(再次由的唯一 IDTriangle索引)。Triangle

这导致了大量的交叉引用,但它确实使查找内容变得非常容易。例如,通过简单地遍历它出现的所有 s 并收集这些s中包含的所有 es,可以直接找到Vertex特定的所有相邻 es 。VertexTriangleVertexTriangle

为方便起见,以下是数据结构的摘要:

在 Rust 中,由于所有权模型,这将不起作用。我能想到的最直接的替代方法是给Geometry对象一个es 和s 的成员HashMap,就像在我的 Python 代码中一样(再次按 ID 索引)。然后,and对象将包含其“成员”的 ID 的向量/数组。然后可以使用此 ID 在.VertexTriangleVertexTriangleHashMap

例如,如果某个Triangle包含VertexID 为 1、2 和 3 的 es,我可以将Triangle对象中的变量 'vertices' 设置为数组[1,2,3]。但是,为了之后实际使用这些Vertex对象,我必须随后在HashMap. 这将导致整个代码中的大量重复。此外,由于TriangleVertex结构体不知道结构体Geometry,因此不可能向其中一个TriangleVertex封装该过程的方法添加一个方法——毕竟,它们无法访问适当的HashMap.

我一直在考虑一种通过借来实现这项工作的方法,以便TriangleandVertex对象实际上可以存储对彼此的引用。但是,我在 Rust 方面的经验严重不足,所以我并没有走得太远。一些最初的幼稚方法总是遇到生命周期问题,我什至开始怀疑我当前的设置在 Rust 范式中是否可行。

非常欢迎对我的问题的任何部分提供所有反馈。理想情况下,我正在寻找一个关于如何按照我的思路实现某些东西的具体建议,但如果你认为我应该重新考虑我的整个方法,那么我也会很高兴听到这个消息。

0 投票
1 回答
86 浏览

rust - 由于添加了明显不相关的指令,我的变量的生命周期是否会发生变化?

我对 Rust 很陌生,并且仍然在阅读这本书时不时编写一些简单的程序来测试我正在学习的内容。

今天我尝试编写一个建议作为练习的程序(更准确地说是第 8.3 章末尾的最后一个)。由于我仍在学习,因此速度很慢,我cargo build几乎为我添加到我的main.rs. 截至目前,它看起来像这样:

没什么复杂的,因为我什至还没有在我的parse_command函数中写任何东西,它目前只返回 a Result::Ok(Command::Exit),但是当我尝试编译上面的代码时,我收到以下错误:

弄清楚应该没什么奇怪的,但是我对这个错误感到很困惑。cmd是的,我在 结尾处下降loop,这没关系,但是为什么借来的值需要活到结尾maincmd里面发生了任何与 相关的事情loop,为什么借来的价值预计会比这更长?

试图找出问题所在,我删除了match手臂内的两条线Command::Add {...},所以它看起来像这样:

而且,令我惊讶的是,编译的代码没有错误(即使我需要这些行,所以这只是一个愚蠢的测试)。

我认为这两行与我的变量无关cmd,或者是吗?这里发生了什么?我 99% 确信我错过了一些非常愚蠢的东西,但我自己无法弄清楚它可能是什么。任何帮助将非常感激!

0 投票
1 回答
1002 浏览

multithreading - 如何告诉 Rust 一个线程的寿命不比它的调用者长?

我有以下代码:

rustc给我编译错误:

闭包可能比当前函数寿命更长,但它借用message了当前函数所拥有的

这是错误的,因为:

  1. 它在这里指的功能是(我相信)main。一旦 main 完成执行,线程将被杀死或进入 UB。

  2. 它所指的函数清楚地在所述线程上调用 .join() 。

以前的代码在任何方面都不安全吗?如果是这样,为什么?如果不是,我怎样才能让编译器理解这一点?

编辑:是的,我知道在这种情况下我可以移动消息,我的问题是专门询问如何传递对它的引用(最好不必堆分配它,类似于此代码的执行方式:

(澄清一下,我实际上想要做的是从两个线程访问线程安全的数据结构......其他不涉及复制工作的问题的解决方案也会有所帮助)。

Edit2:这个被标记为重复的问题有 5 页长,因此我认为它本身就是无效的问题。