rust - 结构使用关联函数重新分配多个字段的简洁方法?

标签 rust

考虑这个 playground示例:

#[allow(dead_code)]
struct Things {
    zero: usize,
    one: usize,
    ...
    nine: usize,
}

fn do_fancy_calculation() -> (usize, usize, usize, usize, usize) {
    (1, 1, 1, 1, 1)
}

impl Things {
    fn renew(&mut self) {
        // does not work:
        // let self {one, two, five, seven, eight} = do_fancy_calculation();

        //
        let (one, two, five, seven, eight) = do_fancy_calculation();
        self.one = one;
        self.two = two;
        self.five = five;
        self.seven = seven;
        self.eight = eight;
    }
}

fn main() {
    let (zero, one, two, three, four, five, six, seven, eight, nine) =
        (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    let mut things = Things {
        zero,
        ...
        nine,
    };

    things.renew();

    println!("{}", things.one);
}

如何在不求助于多个 self.x = y; 类型语句的情况下很好地分配给 one, two, five, seven, 8

我将玩具关联函数称为renew,因为在我的实际用例中,该结构表示某物的状态,我需要刷新/更新/重新创建一些变量来表示状态的变化。我是否打算以错误的方式解决我的用例?

最佳答案

您可以使用赋值更新 self 的字段子集:

*self = Self { one, two, five, seven, eight, ..*self };

这会用匹配的局部变量更新命名字段,并保持其余字段不变。不过,我不确定这是否比您拥有的更具可读性。

我还会考虑其他一些选择。 do_fancy_calculation() 的返回类型并没有真正传达太多意义——也许返回一个 struct 代替?如果该函数总是用于更新 Thing 的状态,您可以将其设为直接更新 Thing 的关联函数,这样您就不需要合并返回值Thing 中的值了。

关于rust - 结构使用关联函数重新分配多个字段的简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901894/

相关文章:

c - rustc 如何能够从 bash 进程替换编译源代码而 gcc 不能?

rust - Rust 中 Option<...> 类型的全局变量

rust - 如何从 Actix-web 中的 HTML 表单的 POST 请求中获取参数?

rust - 有没有推荐的模式来构建具有嵌套类型的Flatbuffer?

rust - 可变引用有移动语义吗?

rust - 如何在HashMap中比较向量的键?

heroku - 将 Rust 应用程序部署到 Heroku 时如何修复 "cannot find -lsqlite3"错误?

multidimensional-array - 如何将2D String数组(未知尺寸)作为参数传递给Rust中的函数

javascript - 使用rust+webassembly进行web开发,如何解决wasm与js交互的额外开销

rust - "thread ' <main> ' has overflowed its stack"构造大树时