问题标签 [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.
rust - 实现树形数据结构
我想实现一个树数据结构。我有一个Node
结构并希望它保存对 childNode
的引用。我试过了:
此代码无法编译:
我该如何实施?
rust - 价值希望为整个功能范围而存在
Rust 抱怨它的get_string
寿命不够长。它似乎想在整个函数范围内保持活力,但我看不出这是怎么发生的。
rust - 如何在处理数据流时有效地构建向量和该向量的索引?
我有一个结构Foo
:
我想处理一个数据流并将结果保存到该字段上并Vec<Foo>
为此创建一个索引。Vec<Foo>
Foo::v
我想使用 aHashMap<&str, usize>
作为索引,键在哪里,&Foo::v
值是 中的位置Vec<Foo>
,但我愿意接受其他建议。
我想尽可能快地处理数据流,这不需要做两次明显的事情。
例如,我想:
String
每个数据流读取只分配一次- 不要搜索索引两次,一次是检查键不存在,一次是插入新键。
- 不要使用
Rc
or增加运行时间RefCell
。
借用检查器不允许此代码:
有多个问题:
hash.entry
借用钥匙,所以s
必须有一个“更大”的生命周期hash
- 我想
s
在 (b) 行移动,而我在 (a) 行有一个只读引用
那么我应该如何在没有额外调用String::clone
或调用HashMap::get
后调用的情况下实现这个简单的算法HashMap::insert
呢?
reference - 为什么在闭包参数中使用“&&”?
关于这个例子,我有两个问题:
为什么
&&x
在闭包参数中使用而不仅仅是x
?我知道这&
是传递对对象的引用,但是两次使用它是什么意思?我不明白文档是怎么说的:
因为
find()
需要一个引用,并且许多迭代器迭代引用,这会导致参数是双重引用的可能令人困惑的情况。您可以在下面的示例中看到这种效果,使用&&x
.为什么
Some(&2)
使用而不是Some(2)
?
rust - 向变量添加大括号如何防止它被匹配借用(拥有?)?
我试图理解Rust 中二叉树的实现,但我无法理解函数中的一些作用域魔法locate_mut
:
memory-management - 结构上的 getter 方法的 Rust 借用问题
我是 Rust 的新手,所以仍在尝试习惯该语言的内存模型。
cannot move out of borrowed content.
因此,当我在结构上构建getter
方法时遇到错误。我不太明白为什么会这样,但它似乎与枚举的某些特征有关。
我收到的错误消息与Enum
性别有关。
我确保参考自我。我也没有在这些函数中进行任何分配——只是 getter 函数——但不知何故,借用变得一团糟。
multithreading - 多个线程如何共享一个迭代器?
我一直在研究一个函数,它将使用 Rust 和线程将一堆文件从源复制到目标。我在让线程共享迭代器时遇到了一些麻烦。我还不习惯借阅系统:
我收到了我无法解决的编译错误:
我已经看到了以下问题:
当使用多个我不使用的线程时,值的寿命不够长chunks
,我想尝试通过线程共享一个迭代器,尽管创建块以将它们传递给线程将是经典的解决方案。
无法在线程之间发送 &str 因为它的寿命不够长 我已经看到了一些使用通道与线程通信的答案,但我不太确定使用它们。应该有一种更简单的方法来通过线程共享一个对象。
为什么局部变量对于 thread::scoped 的寿命不够长
这引起了我的注意,scoped
应该可以解决我的错误,但是由于它位于不稳定的通道中,我想看看是否有另一种方法可以使用spawn
.
有人可以解释我应该如何修复生命周期以便可以从线程访问迭代器吗?
rust - Rust 中多重交叉引用的最佳方法是什么?
我正在将某些随机几何的蒙特卡罗模拟从 Python 转换为 Rust。我在 Python 中拥有的自由让我在整个代码中存储对其他对象的引用有点草率,但这似乎在 Rust 中实现起来更棘手。
在我当前的 Python 实现中,主要对象是Geometry
. 它包含一个Vertex
带有唯一 ID 的 es 字典(ID 也是它在字典中的查找键)和一个Triangle
s 字典(与 for 相同的场景Vertex
)。EveryTriangle
包含三个Vertex
es 的列表(这次没有字典,这里是有序列表),并且 everyVertex
包含它出现的所有 s 的字典(再次由的唯一 IDTriangle
索引)。Triangle
这导致了大量的交叉引用,但它确实使查找内容变得非常容易。例如,通过简单地遍历它出现的所有 s 并收集这些s中包含的所有 es,可以直接找到Vertex
特定的所有相邻 es 。Vertex
Triangle
Vertex
Triangle
为方便起见,以下是数据结构的摘要:
在 Rust 中,由于所有权模型,这将不起作用。我能想到的最直接的替代方法是给Geometry
对象一个es 和s 的成员HashMap
,就像在我的 Python 代码中一样(再次按 ID 索引)。然后,and对象将包含其“成员”的 ID 的向量/数组。然后可以使用此 ID 在.Vertex
Triangle
Vertex
Triangle
HashMap
例如,如果某个Triangle
包含Vertex
ID 为 1、2 和 3 的 es,我可以将Triangle
对象中的变量 'vertices' 设置为数组[1,2,3]
。但是,为了之后实际使用这些Vertex
对象,我必须随后在HashMap
. 这将导致整个代码中的大量重复。此外,由于Triangle
和Vertex
结构体不知道结构体Geometry
,因此不可能向其中一个Triangle
或Vertex
封装该过程的方法添加一个方法——毕竟,它们无法访问适当的HashMap
.
我一直在考虑一种通过借来实现这项工作的方法,以便Triangle
andVertex
对象实际上可以存储对彼此的引用。但是,我在 Rust 方面的经验严重不足,所以我并没有走得太远。一些最初的幼稚方法总是遇到生命周期问题,我什至开始怀疑我当前的设置在 Rust 范式中是否可行。
非常欢迎对我的问题的任何部分提供所有反馈。理想情况下,我正在寻找一个关于如何按照我的思路实现某些东西的具体建议,但如果你认为我应该重新考虑我的整个方法,那么我也会很高兴听到这个消息。
rust - 由于添加了明显不相关的指令,我的变量的生命周期是否会发生变化?
我对 Rust 很陌生,并且仍然在阅读这本书时不时编写一些简单的程序来测试我正在学习的内容。
今天我尝试编写一个建议作为练习的程序(更准确地说是第 8.3 章末尾的最后一个)。由于我仍在学习,因此速度很慢,我cargo build
几乎为我添加到我的main.rs
. 截至目前,它看起来像这样:
没什么复杂的,因为我什至还没有在我的parse_command
函数中写任何东西,它目前只返回 a Result::Ok(Command::Exit)
,但是当我尝试编译上面的代码时,我收到以下错误:
弄清楚应该没什么奇怪的,但是我对这个错误感到很困惑。cmd
是的,我在 结尾处下降loop
,这没关系,但是为什么借来的值需要活到结尾main
?cmd
里面发生了任何与 相关的事情loop
,为什么借来的价值预计会比这更长?
试图找出问题所在,我删除了match
手臂内的两条线Command::Add {...}
,所以它看起来像这样:
而且,令我惊讶的是,编译的代码没有错误(即使我需要这些行,所以这只是一个愚蠢的测试)。
我认为这两行与我的变量无关cmd
,或者是吗?这里发生了什么?我 99% 确信我错过了一些非常愚蠢的东西,但我自己无法弄清楚它可能是什么。任何帮助将非常感激!
multithreading - 如何告诉 Rust 一个线程的寿命不比它的调用者长?
我有以下代码:
rustc
给我编译错误:
闭包可能比当前函数寿命更长,但它借用
message
了当前函数所拥有的
这是错误的,因为:
它在这里指的功能是(我相信)main。一旦 main 完成执行,线程将被杀死或进入 UB。
它所指的函数清楚地在所述线程上调用 .join() 。
以前的代码在任何方面都不安全吗?如果是这样,为什么?如果不是,我怎样才能让编译器理解这一点?
编辑:是的,我知道在这种情况下我可以移动消息,我的问题是专门询问如何传递对它的引用(最好不必堆分配它,类似于此代码的执行方式:
(澄清一下,我实际上想要做的是从两个线程访问线程安全的数据结构......其他不涉及复制工作的问题的解决方案也会有所帮助)。
Edit2:这个被标记为重复的问题有 5 页长,因此我认为它本身就是无效的问题。