首页 > 解决方案 > 如何在结构初始化时运行函数?

问题描述

我有一个结构:

struct MyStruct {
    pub a: i32,
    pub b: i32,
}

实例化时MyStruct,我想除以a2:

let a = MyStruct { a: 26, b: 42 };
println!("{:?}", a);
// MyStruct { a: 13, b: 42 }

它是否有可能自动发生,还是我必须创建一个instantiate函数并在每次创建时调用它MyStruct

标签: rust

解决方案


我想你会想要创建一个模块,就像@eggyal 在评论中建议的那样。这是一个代码示例,说明了如何编写:

#[derive(Debug)]
struct MyStructLiteral {
    pub a: i32,
    pub b: i32,
}

mod foo {
    #[derive(Debug)]
    pub struct MyStruct {
        a: i32,
        b: i32,
    }
    
    impl MyStruct {
        pub fn new(a: i32, b: i32) -> MyStruct {
            MyStruct { a: a / 2, b: b / 2 }
        }
    }
}

fn main() {
    let a = MyStructLiteral { a: 26, b: 42 };
    println!("{:?}", a);

    let alt = foo::MyStruct::new(26, 42);
    println!("{:?}", alt);
}

这是在锈游乐场

输出是:

MyStructLiteral { a: 26, b: 42 }
MyStruct { a: 13, b: 21 }

Steve Klabnik 有一篇很好的博客文章,涵盖了 Rust 中的结构字面量与构造函数

请注意,如果您想调用MyStruct::new并且不必使用模块名称,则可以use使用模块,这样您就不必为模块名称添加前缀:

use self::foo::MyStruct;

推荐阅读