如何在Rust中创建一个二维数组,并用结构体动态填充它?
我定义了一个含有四个字段的结构体。这个结构体表示一个小时的数据点。我想收集并按小时对一周的数据进行分组。因此我需要一个7×24的数组。每天的数据都是一个Struct类型的数组。然而,我在实例化这个数组时遇到了问题。
我尝试了这个回答中的方法this answer;然而,这样做只创建了一个结构体向量,而不是一个二维数组。
理想情况下,我希望能够像下面这样访问:
array[daily_counter][hourly_counter].push(hour_data);
解决方案
先弄清你真正想要的东西。你一天有固定的24小时,一周有固定的7 天,你想要收集的周数又是未知的,对吧?所以这直接映射到一个 Vec<[[HourlyData; 24]; 7]>,其中内部维度是编译时已知的固定长度数组,而外部维度 Vec 会随着你累积更多周而动态增长。
不过,在你的访问模式中有一处值得纠正的是,array[daily_counter][hourly_counter].push(hour_data) 不会起作用,因为对一个 [[HourlyData; 24]; 7] 进行两次下标访问会得到一个单独的 HourlyData 结构体,而结构体没有 .push()。你真正需要的是直接把值赋给槽位,然后把完成的一周推入你的集合。
struct HourlyData {
// your four fields here
}
let mut week: [[HourlyData; 24]; 7] = std::array::from_fn(|_| {
std::array::from_fn(|_| HourlyData { /* default field values */ })
});
week[daily_counter][hourly_counter] = hour_data;
let mut group_collection: Vec<[[HourlyData; 24]; 7]> = Vec::new();
group_collection.push(week);
而 std::array::from_fn 是你在这里正确的初始化工具,因为你的结构体很可能没有实现 Copy,所以你不能用简单的重复表达式来初始化数组。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。