问题标签 [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.

0 投票
3 回答
10688 浏览

rust - 根据值从 HashMap 中删除条目

我编写了以下代码 ( + demoHashMap ) 以从基于值的值中删除条目。它有效,但我觉得我正在努力使用借用检查器

  • clone()避免两次引用同一组键
  • 一个额外的let tmp =绑定来增加我的临时值的生命周期

有没有一种更清洁、更惯用的方法来实现这一点?

0 投票
1 回答
2267 浏览

rust - 汇总命令行参数时“无法移出借用的内容”

这是我的第一个 Rust 程序,似乎我已经遇到了可怕的借用检查器。:)

程序应该读取命令行中传递的参数,对它们求和并返回结果。我无法将参数解析为整数。

失败了:

我应该如何进行?

0 投票
3 回答
2146 浏览

rust - 暂时搬出借来的内容

我正在尝试替换可变借用中的值;将其中的一部分移入新值:

上面的代码不起作用,可以理解的是,将值移出会self破坏它的完整性。但由于该值在之后立即被删除,我(如果不是编译器)可以保证它的安全性。

有没有办法做到这一点?我觉得这是不安全代码的工作,但我不确定它是如何工作的。

0 投票
1 回答
1415 浏览

rust - as_mut().unwrap():由于需求冲突,无法推断生命周期

Rust 的生命周期再次让我感到困惑。我正在尝试返回对我拥有的盒装对象的可变引用。这是我的问题简化:

我收到这些错误,我不太明白:

我不知道如何解决这个问题。

0 投票
1 回答
125 浏览

rust - 与(在表面上)似乎完全安全的短暂生命周期价值混淆

我在用 Rust 编写词法分析器时遇到问题,其中某些函数开始抱怨简单的片段,否则这些片段看起来无害。这开始变得令人烦恼,因为错误消息无法帮助我查明问题的原因,所以这是我在同一周内第二次接触同一个程序(上一个问题在这里)。

我读过这本书,我已经明白了我能从中得到的一切。我还观看/阅读了许多其他讨论生命周期(显式和隐式)的文章和视频,并且在大多数情况下,借用和移动背后的概念非常有意义,除了以下情况:

我的词法分析器有一个next功能,其目的是查看下一个字符并返回它。

我这样做时遇到的错误是:

我从这个错误中了解到,来自的价值peekable()不够长,这对我来说很有意义。我只是引用该行中的返回并调用另一个函数,我想它是用迭代器返回一个指向下一个位置的字符的指针。我对此的天真解决方案是:

如果我实施此解决方案,我会看到一个不同的错误,这对我来说也没有意义:

我不太确定是什么self从借来的上下文中移出(我知道它是从借来的,&self但不确定是什么将它从借来的上下文中移出。

编辑

我提出了一个细节非常不准确的问题。包含这些详细信息的帖子部分已根据实际情况进行了更新——我混合了两种不同的情况,我遇到了类似的错误(至少与我相似)。

0 投票
2 回答
570 浏览

rust - 您可以控制借用结构与借用字段吗?

我正在开发一个涉及以下结构的程序:

简而言之,该data字段包含一些字节,并且overlay是要在特定索引处插入的一系列字节序列。类型并不重要,Sink只是它具有如下功能:

我已经实现了一个迭代器来合并来自dataoverlay消费的信息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)

0 投票
1 回答
2565 浏览

hashmap - 在 struct impl 中以 &mut 的形式访问 hashmap 字段值

给定一个像这样的简单结构:

访问的最佳方式Client&mut什么?考虑以下代码:

我看到的仅有的两个选项是在客户端中使用RefCell/ Cell,这让事情看起来非常可怕:

或者包装clientsin RefCell,这使得不可能有像这样的简单方法Server

强迫我使用闭包(例如with_client_by_token(|c| ...))。

0 投票
4 回答
686 浏览

rust - 如何使用(不安全的)别名?

Rust 有严格的别名规则。但是,如果“我知道自己在做什么”,我可以绕过它们吗?

我正在尝试将一个 C 函数转换为 Rust,该函数通过从输入缓冲区读取并写入目标缓冲区来执行复杂的操作,但它有一个巧妙的优化,允许输入和输出缓冲区相同:

为了这个问题,让我们说它是这样的:

在 Rust 的安全子集中​​,我必须有两个几乎复制和粘贴的函数版本fn(&mut)fn(&, &mut).

有没有办法欺骗 Rust 以获得对同一缓冲区的可变和不可变引用?

0 投票
1 回答
778 浏览

rust - 如何将 C 变长数组代码转换为 Rust?

我知道 Rust 不支持可变长度数组,但这让我想知道用什么替换它们,因为:

  • 我不想在循环中分配和释放一个小的 Vec
  • 借用检查器不允许我将代码移出循环
  • 固定大小的数组有很多限制,所以我不知道如何使用它们

我正在转换的 C 代码通过在每一行上调用回调来处理图像,并传递一个小的指针数组:

我的 Rust 尝试(在 playpen 中的示例):

但它被拒绝了:

[&mut [f32]]不能从类型元素的迭代器构建类型集合&mut [f32]

可悲的是,这听起来和我想要做的完全一样!

我尝试过使用固定大小的数组,但 Rust 不支持它们的泛型,所以我不能从迭代器中填充它,也不能在类似 C 的循环中填充它们,因为引用被引入循环不会超过它。

该特征core::iter::FromIterator<&mut [f32]>未针对该类型实现[&mut [f32]; 4]


从固定大小的数组中获取内存片的另一种方法也失败了:

错误:一次不能多次借用img.chanmutable

0 投票
0 回答
43 浏览

rust - 匹配枚举的选项时无法移出借用的内容

我对 Rust 很陌生,所以请说出我不明白的内容。我正在尝试匹配对结构的引用。它有一个op类型为 的字段Option<Operator>,其中Operator是一个已定义的枚举。这是代码:

但是我收到以下错误,我有点理解并且有点不理解:

这样的事情应该如何“正确”实施以匹配?