元组分配给可变结构参数

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错误。我有什么误解吗?

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

Pet*_*aro 5

正如有用的错误解释所示,您尝试分配给非位置表达式。位置表达式表示内存位置,因此它可以是变量、取消引用、索引表达式或字段引用,但元组不是其中之一。

如果您要使用绑定,例如:

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索引。例如

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() { ... }
Run Code Online (Sandbox Code Playgroud)

rustc --explain E0070


归档时间:

查看次数:

400 次

最近记录:

5 年,9 月 前