7l-*_*l04 1 methods tuples rust
I\xe2\x80\x99m 收到错误 I\xe2\x80\x99m 不确定如何处理,与 I\xe2\x80\x99m 尝试的元组分配相关。下面的函数incr出现left-hand of expression not valid错误。我有什么误解吗?
struct Fib {\n i: u64,\n fa: u64,\n fb: u64,\n}\n\nimpl Fib {\n fn incr(&mut self) {\n self.i += 1;\n (self.fa, self.fb) = (self.fa + self.fb, self.fa);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
正如有用的错误解释所示†,您尝试分配给非位置表达式。位置表达式表示内存位置,因此它可以是变量、取消引用、索引表达式或字段引用,但元组不是其中之一。
如果您要使用绑定,例如:
let (x, y) = (1, 2);
Run Code Online (Sandbox Code Playgroud)
这将是一个完全不同的故事,因为let语句与赋值具有不同的规则:语句的左侧let是模式,而不是表达式,并且(x, y)是合法模式。
为了解决您的问题,您可能需要执行以下操作并引入临时变量,然后更新成员的值:
(以下内容还修复了您的斐波那契序列,即更正成员的值,因为它们自然排序为“a”和“b”)
impl Fib {
fn incr(&mut self) {
self.i += 1;
let fa = self.fa;
self.fa = self.fb;
self.fb += fa;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:
Iterator尽管这不是您的问题,但我强烈建议您针对您的类型实现Fib,在这种情况下您不必跟踪索引 (i),因为可以通过该方法获得该enumerate索引。例如Run Code Online (Sandbox Code Playgroud)impl Iterator for Fib { type Item = u64; fn next(&mut self) -> Option<Self::Item> { let fa = self.fa; self.fa = self.fb; self.fb += fa; Some(fa) } }然后你可以将它用作:
Run Code Online (Sandbox Code Playgroud)for (i, x) in my_fib.enumerate() { ... }
| 归档时间: |
|
| 查看次数: |
400 次 |
| 最近记录: |