gpt4 book ai didi

rust - 简洁的结构初始化器是可能的

转载 作者:行者123 更新时间:2023-12-03 11:32:36 24 4
gpt4 key购买 nike

说我有

struct S1{
name:&'s str,
start : u8,
end : u8,
}
我想把它们排列成阵列
在C和C++中,我可以使用(一种v通用模式)
  S1 arr[] ={
{"foo",1,2},
{"bar",4,5},
}
好像一定在使用rust
  let arr = [
S1{name:"foo", start:1, end: 2},
S1{name:"bar", start:4, end: 5},
]
这里的问题是a)大量输入b)表中的信息被重复的结构和字段名淹没。
我已经知道我可以使用元组
let arr = [("foo",1,2),("bar",3,4)]
但是我失去了按名称引用字段的功能。
我错过了什么?也许是一个助手宏? (写了3天的 rust 迹,如果是常见问题或愚蠢的话,请您道歉)

最佳答案

您可以选择使用构造函数,该构造函数等效于元组版本,但由于函数调用而具有额外的前缀:

let arr = [S1::new("foo",1,2), S1::new("bar",3,4)]
如果您想模拟元组数组/C++括号,并且除了数组内的初始值外什么都没有,则可以使用宏将参数元组/组列表扩展为构造函数调用:
let arr = expand![
("foo", 1, 2),
("bar", 3, 4),
("baz", 5, 6),
("qux", 7, 8)
];
expand!声明如下:
macro_rules! expand {
( $( ($name:expr, $start:expr, $end:expr) ),* ) => {
[ $( S1 { name: $name, start: $start, end: $end } ),* ]
}
}
如果您想使用大括号而不是括号来对参数进行分组,只需将括号中包含 $name:expr, $start:expr, $end:expr的括号替换为大括号即可。请注意,您可以使用花括号,括号或方括号来调用宏,因此可以使它看起来与C++版本完全一样,但不包括宏调用:
let arr = expand! {
{"foo", 1, 2},
{"bar", 3, 4},
{"baz", 5, 6},
{"qux", 7, 8}
};
Playground

关于rust - 简洁的结构初始化器是可能的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63060947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com