如何在结构定义中初始化数组?
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 在“锈书”中【讨论】:
常见的模式是在库中同时拥有Default
和new()
。对于应用程序,我倾向于只有Default
,但这是基于意见的
3 也可以使用 new:Sf1, f2, ..S::new()
。实际上,您可以使用任何返回此结构的表达式。以上是关于如何在结构定义中初始化数组?的主要内容,如果未能解决你的问题,请参考以下文章