【问题标题】:How to initialize an array in a struct definition?如何在结构定义中初始化数组?
【发布时间】:2021-12-23 10:51:59
【问题描述】:

如何在这个结构中将数组值设置为 0?这显然是错误的。如何正确操作?

struct Game {
    board: [[i32; 3]; 3] = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
}

在函数中应该是:

let board: [[i32; 3]; 3] = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];

【问题讨论】:

  • 你是否尝试在初始化结构时设置默认值?通常你会有一个构造函数来创建具有正确默认值的结构。
  • 是的,所以板子在初始化时总是一样的,以后会改变值。 @loganfsmyth
  • 不清楚您要达到的目标。您想避免一次又一次地编写此代码吗?使用构造函数(无论如何都要使用它)。您是否想完全避免它,出于某种原因(例如,它超过 3 项并且很冗长)?您可以将Default::default() 用于默认值(0 用于整数)或数组初始化语法用于任何其他常量值([[0; 3]; 3]

标签: struct rust


【解决方案1】:

您不能初始化结构定义中的字段,因为它是行为,而结构必须只包含数据

这应该可行:

struct  Game {
    board: [[i32; 3]; 3]
}

impl Game{
   fn new()->Self{
      Self{
        board: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
      }
   }
}

...
let game = Game::new();

【讨论】:

    【解决方案2】:

    如果你想为一个结构定义一个默认值,你可以为它实现Default trait。

    对于包含自身实现Default的值的结构,就像添加#[derive(Default)]一样简单:

    #[derive(Default,Debug)]
    struct  Game {
        board: [[i32; 3]; 3]
    }
    
    
    fn main() {
        let game : Game = Default::default();
        println!("{:?}", game);
    }
    

    或者,如果您的结构更复杂,您可以手动实现Default

    Playground

    使用Default 优于编写构造函数(如 Angelicos 的回答)的优势在于:

    1. 可以使用derive来实现
    2. 包含结构的数据结构也可以使用derive
    3. 您可以使用..Default::default() struct update syntax 指定结构的某些字段,而将其余字段默认设置。

    另见:

    【讨论】:

    • 常见的模式是在库中同时拥有Defaultnew()。对于应用程序,我倾向于只有Default,但这是基于意见的
    • 3 也可以使用 new:S{f1, f2, ..S::new()}。实际上,您可以使用任何返回此结构的表达式。
    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多