问题标签 [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 投票
2 回答
840 浏览

rust - 我是否错误地实现了 IntoIterator 以引用 LazyList 实现,或者这是一个 Rust 错误?

在实现 LazyList 的一个版本(一个不可变的延迟计算的记忆单链表,就像 Haskell 列表一样)时,我遇到了一个实现问题IntoIterator,因为代码在我认为应该删除引用时没有删除引用。以下代码已被简化,只是为了说明问题;因此,它不是通用的,并且不包括与实施无关的所有方法IntoIterator

上面的代码失败了:

如 中的注释中main()所述,代码是可用的,除非通过 IntoIterator trait 作为引用调用。这可能是为引用实现特征的错误,其中包含指针的返回迭代器的所有权没有转移到与调用相同的范围,IntoIterator::into_iter而是转移到'static生命周期,因此,它不会在预期时被删除。

如果可能的话,我该如何实现?我尝试向结构添加一个std::marker::PhantomData<>标记字段,Iter但似乎也分配了一个'static生命周期。

0 投票
1 回答
245 浏览

rust - 在 Rust 闭包中重用绑定

我正在尝试生成Vec<(Point, f64)>

我收到以下错误:

我知道我不能point在元组的两个元素中使用,但是当我尝试存储引用时,我收到关于生命周期的错误。

0 投票
1 回答
2428 浏览

vector - 无法将 &u8 与 u8 进行比较

上述函数无法编译,比较时出现以下错误:

特征 `&u8: std::cmp::PartialEq` 不满足

我将其读为:“c是一个借来的字节,不能与常规字节进行比较”,但我一定是读错了。

Vec<u8>根据特定值拆分 a 的适当方法是什么?

我确实意识到在读取文件时有一些选项,比如拆分 aBufReader或者我可以将向量转换为字符串并使用str::split. 我可能会采用这样的解决方案(传入 aBufReader而不是 a Vec<u8>),但现在我只是在玩,测试东西,想知道我做错了什么。

0 投票
1 回答
329 浏览

rust - 使用具有生命周期参数的关联类型的特征的生命周期错误

由于使用了关联类型,我在 Rust 1.14 中遇到了生命周期错误,以下两个类似的程序证明了这一点,第一个编译没有错误,第二个有生命周期错误。

程序 #1 — 编译没有错误

程序 #2 — 存在生命周期错误

这是第二个程序的编译时错误:

这是两个程序的差异:

唯一的区别是通过将第一个程序更改为使用关联类型而不是struct定义中的类型参数,会发生生命周期错误。我不知道为什么会这样。据我所知,关联类型不应该产生任何额外的生命周期限制——这都是 just 'a,但显然 Rust 编译器不同意。

如果我用简单的实例化替换第二个程序main函数中的迭代,那么生命周期错误就会消失。那是:

我不明白为什么迭代与直接实例化有什么不同。

0 投票
2 回答
211 浏览

rust - 内部可变性与数据隐藏以固定可变借用的引用

如果我们运行它,那么我们会正确地得到错误“无法分配给不可变字段a.x”。

如果我们删除这两个//注释,并注释掉这个坏行,那么我们会得到错误“无法分配给&引用中的数据”。这是有道理的,因为&mut不提供内部可变性。我们可以&A自由地重新借用,所以这不能提供可变访问,ala&&mut&&.

如果我们同时删除//注释和/* */注释,那么整个事情都会编译,允许违反我们的不变量的坏行a.x永远不能指向其他任何东西。

应该如何维护这个x不可更改的不变量?我们可以在提供公共解引用方法的同时将字段设为私有,除了A不可接受的为 in 编写构造函数。

我们可以通过创建A一个包装器的私有成员来避免令人讨厌的构造函数,该包装器struct AA(A)本身承载公共解引用方法。现在AA需要一个简单的构造函数,但它不需要所有字段的参数A,不影响执行顺序等。如果我们需要为两者实现一些特征,这将变得很A痛苦AA

然而,另一种方法是通过使用内部可变性Cell<A>,使用Cell::replace,然后再放回去。这听起来很有问题,但表明存在更多解决方案。

任何更清洁的方法?

0 投票
1 回答
22036 浏览

rust - 价值的寿命不够长

我不完全理解生命,但我认为b' 的生命将在self' 之前结束。

那么,如何编辑这段代码呢?我在内存中复制一些东西吗?如果我做一个新的实例,这个生命周期必须遵守这个案例。

错误:

0 投票
1 回答
168 浏览

reference - 如何让 RefCell 的 Ref 寿命足够长

我正在为 Rust 开发一种编程语言的解释器。一切都很顺利,直到我决定实现闭包,这引起了一些巨大的头痛,因为现在每个闭包值都需要对其定义的环境有一个可变引用。我终于让它大部分工作RefCell,但我现在正在运行又犯了一个我不知道如何解决的错误。

以下是相关代码:

如何更改代码以使其编译?

0 投票
1 回答
143 浏览

rust - 使用作为闭包参数传​​递的引用调用可变方法时无法推断出适当的生命周期

我正在尝试用 Rust 制作一个小游戏。我想使用类似于实体组件系统模式的东西来处理所有游戏对象。

我的总体想法是有一个GameLoop结构,它包含更新和绘制游戏所需的所有数据(屏幕、时间戳……)。

World结构应该包含所有游戏实体并在dispatch函数中更新它们。它还调用存储在World结构中的所有注册回调(那些是“系统”)。但是,它们在示例代码中是多余的。

我试图尽可能地分解代码,只包含相关部分。

借贷/寿命似乎有问题。编译器除了冗长之外什么都没有。

问题似乎是&world.dispatch(&mut tick_data)游戏更新函数中的调用,它应该更新所有游戏实体。如果我将其注释掉,则程序编译不会出现任何错误。

这是编译器告诉我的:

我根本无法发现错误的原因。这些函数以一种程序方式调用,因为我只是借用了大部分数据,所以生命周期应该没有问题。

当我从结构中删除引用时,TickData它只包含为Copy特征实现的值,它也可以工作。

我通常不是那种张贴代码墙并要求人们修复它的人,但我现在真的一无所知。

0 投票
1 回答
1000 浏览

rust - Rust 中的多次借用

在 Rust 中实现这样的东西有什么共同的模式吗?

错误是

我理解这个问题,但不知道如何在 Rust 中实现这样的东西。

该代码也可在操场上获得。

0 投票
0 回答
44 浏览

memory-management - 为什么运算符重载的特征需要对自身的所有权?

为什么我不能只&selfAdd特征中使用:

这样我就不必担心使用+运算符后结构会移动。这对我来说通常不是问题,因为我使用#[derive(Debug, Copy, Clone)]但我仍然想知道为什么。