问题标签 [borrow-checker]
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 - 根据值从 HashMap 中删除条目
我编写了以下代码 ( + demoHashMap
) 以从基于值的值中删除条目。它有效,但我觉得我正在努力使用借用检查器:
clone()
避免两次引用同一组键- 一个额外的
let tmp =
绑定来增加我的临时值的生命周期
有没有一种更清洁、更惯用的方法来实现这一点?
rust - 汇总命令行参数时“无法移出借用的内容”
这是我的第一个 Rust 程序,似乎我已经遇到了可怕的借用检查器。:)
程序应该读取命令行中传递的参数,对它们求和并返回结果。我无法将参数解析为整数。
失败了:
我应该如何进行?
rust - 暂时搬出借来的内容
我正在尝试替换可变借用中的值;将其中的一部分移入新值:
上面的代码不起作用,可以理解的是,将值移出会self
破坏它的完整性。但由于该值在之后立即被删除,我(如果不是编译器)可以保证它的安全性。
有没有办法做到这一点?我觉得这是不安全代码的工作,但我不确定它是如何工作的。
rust - as_mut().unwrap():由于需求冲突,无法推断生命周期
Rust 的生命周期再次让我感到困惑。我正在尝试返回对我拥有的盒装对象的可变引用。这是我的问题简化:
我收到这些错误,我不太明白:
我不知道如何解决这个问题。
rust - 与(在表面上)似乎完全安全的短暂生命周期价值混淆
我在用 Rust 编写词法分析器时遇到问题,其中某些函数开始抱怨简单的片段,否则这些片段看起来无害。这开始变得令人烦恼,因为错误消息无法帮助我查明问题的原因,所以这是我在同一周内第二次接触同一个程序(上一个问题在这里)。
我读过这本书,我已经明白了我能从中得到的一切。我还观看/阅读了许多其他讨论生命周期(显式和隐式)的文章和视频,并且在大多数情况下,借用和移动背后的概念非常有意义,除了以下情况:
我的词法分析器有一个next
功能,其目的是查看下一个字符并返回它。
我这样做时遇到的错误是:
我从这个错误中了解到,来自的价值peekable()
不够长,这对我来说很有意义。我只是引用该行中的返回并调用另一个函数,我想它是用迭代器返回一个指向下一个位置的字符的指针。我对此的天真解决方案是:
如果我实施此解决方案,我会看到一个不同的错误,这对我来说也没有意义:
我不太确定是什么self
从借来的上下文中移出(我知道它是从借来的,&self
但不确定是什么将它从借来的上下文中移出。
编辑
我提出了一个细节非常不准确的问题。包含这些详细信息的帖子部分已根据实际情况进行了更新——我混合了两种不同的情况,我遇到了类似的错误(至少与我相似)。
rust - 您可以控制借用结构与借用字段吗?
我正在开发一个涉及以下结构的程序:
简而言之,该data
字段包含一些字节,并且overlay
是要在特定索引处插入的一系列字节序列。类型并不重要,Sink
只是它具有如下功能:
我已经实现了一个迭代器来合并来自data
和overlay
消费的信息Sink
。
我认为这是一个小小的谎言,因为迭代器返回的每个 &[u8] 的生命周期并不总是原始的生命周期data
。从插入的数据overlay
具有不同的生命周期,但我不知道如何更准确地注释它。无论如何,借用检查器似乎并不介意 - 以下方法有效:
我最终在merge
所有地方都使用了这个功能,但总是针对相同的数据/覆盖。所以我想我会App::merge
为了方便添加一个函数,这就是问题开始的地方:
App::process
现在无法通过借用检查器 - 在借用 self 时,它拒绝允许 self.sink 的可变借用。
我已经为此苦苦挣扎了一段时间,如果我理解正确,问题不在于process
这个签名,而是在于:
在这里,我基本上告诉借用检查器,向量中返回的引用等同于self
借用。
尽管我觉得我现在已经理解了这个问题,但我仍然觉得我的双手被束缚了。忽略生命周期注释并没有帮助(因为编译器做了等价的?),并且只涉及两个引用,我无法告诉 rust 输出引用的生命周期绑定到其他东西。
我也试过这个:
但是编译器抱怨该let
语句(“由于需求冲突,无法推断出适当的生命周期”——我还发现编译器没有解释所述要求令人愤怒)。
有可能实现这一目标吗?Rust 参考是对生命周期注释和相关语法的一种解释。
rustc 1.0.0-nightly (706be5ba1 2015-02-05 23:14:28 +0000)
hashmap - 在 struct impl 中以 &mut 的形式访问 hashmap 字段值
给定一个像这样的简单结构:
访问的最佳方式Client
是&mut
什么?考虑以下代码:
我看到的仅有的两个选项是在客户端中使用RefCell
/ Cell
,这让事情看起来非常可怕:
或者包装clients
in RefCell
,这使得不可能有像这样的简单方法Server
:
强迫我使用闭包(例如with_client_by_token(|c| ...)
)。
rust - 如何使用(不安全的)别名?
Rust 有严格的别名规则。但是,如果“我知道自己在做什么”,我可以绕过它们吗?
我正在尝试将一个 C 函数转换为 Rust,该函数通过从输入缓冲区读取并写入目标缓冲区来执行复杂的操作,但它有一个巧妙的优化,允许输入和输出缓冲区相同:
为了这个问题,让我们说它是这样的:
在 Rust 的安全子集中,我必须有两个几乎复制和粘贴的函数版本fn(&mut)
和fn(&, &mut)
.
有没有办法欺骗 Rust 以获得对同一缓冲区的可变和不可变引用?
rust - 如何将 C 变长数组代码转换为 Rust?
我知道 Rust 不支持可变长度数组,但这让我想知道用什么替换它们,因为:
- 我不想在循环中分配和释放一个小的 Vec
- 借用检查器不允许我将代码移出循环
- 固定大小的数组有很多限制,所以我不知道如何使用它们
我正在转换的 C 代码通过在每一行上调用回调来处理图像,并传递一个小的指针数组:
我的 Rust 尝试(在 playpen 中的示例):
但它被拒绝了:
[&mut [f32]]
不能从类型元素的迭代器构建类型集合&mut [f32]
可悲的是,这听起来和我想要做的完全一样!
我尝试过使用固定大小的数组,但 Rust 不支持它们的泛型,所以我不能从迭代器中填充它,也不能在类似 C 的循环中填充它们,因为引用被引入循环不会超过它。
该特征
core::iter::FromIterator<&mut [f32]>
未针对该类型实现[&mut [f32]; 4]
从固定大小的数组中获取内存片的另一种方法也失败了:
错误:一次不能多次借用
img.chan
mutable
rust - 匹配枚举的选项时无法移出借用的内容
我对 Rust 很陌生,所以请说出我不明白的内容。我正在尝试匹配对结构的引用。它有一个op
类型为 的字段Option<Operator>
,其中Operator
是一个已定义的枚举。这是代码:
但是我收到以下错误,我有点理解并且有点不理解:
这样的事情应该如何“正确”实施以匹配?