如何在结构定义中初始化数组?

Posted

技术标签:

【中文标题】如何在结构定义中初始化数组?【英文标题】: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] 【参考方案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 的回答)的优势在于:

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

另见:

The Default Trait 在“Rust 设计模式”中 Derivable Traits 在“锈书”中

【讨论】:

常见的模式是在库中同时拥有Defaultnew()。对于应用程序,我倾向于只有Default,但这是基于意见的 3 也可以使用 new:Sf1, f2, ..S::new()。实际上,您可以使用任何返回此结构的表达式。

以上是关于如何在结构定义中初始化数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何初始化在结构中声明的数组?

如何对结构体变量进行初始化

如何将结构数组里的两个成员位置交换

宏定义中对结构体变量进行初始化,结构体成员变量前为啥加点号??

c语言,结构体数组怎么初始化

C语言,结构体中的数组怎么赋值,?