在struct内部的数组中添加一个元素



在solid 8.12上工作,我有两个结构体,即singerevent,两个数组,一个用于歌手,另一个用于事件。我想写一个函数来创建一个事件,指定歌手id,并自动将事件id附加到歌手参加的事件数组中:


struct Singer {
uint id;
uint[] events_ids; // THIS IS WHAT I WANT TO UPDATE WITH THE NEW EVENT ID
}
struct Event {
uint id;
uint singer_id;
}
singer[] public SingerList;
event[] public EventList;
uint public n_singers;
uint public n_events;
function CreateEvent(uint singer_id) external {
if (singer_id > n_singers) { // singer id greater than the number of current singers.
revert SingerIdError(singer_id);
}
else if (singer_id == n_singers){ // the singer does not exist yet! Create it!
n_singers ++;
-------->   SingerList.push(Singer(singer_id))); // HOW TO APPEND THE EVENT ID TO THE LIST OF EVENTS IN SINGER STRUCT?
EventList.push(Event(n_events, singer_id));

}
else { // the pilot already exists
Singer storage _singer = SingerList[singer_id];
_singer.event_ids.push(n_events);
EventList.push(Event(n_events, n_events));
}
n_events ++;
}```

使用'mapping'而不是arrayof -struct,可以更好地控制状态变量,而无需额外的麻烦来控制数组索引。它也花费更低的天然气费用。

mapping(uint => uint[]) Singer;
mapping(uint => uint[]) Event;
uint public n_singers;
uint public n_events;
function CreateEvent(uint singer_id) external {
if(singer_id > n_singers) {
revert SingerIdError(singer_id);
}
else if (singer_id == n_singers) {
n_singers ++;
Singer[singer_id].push(n_events); // HOW TO APPEND THE EVENT ID TO THE LIS....
Event[n_events].push(singer_id);
} else {
Singer[singer_id].push(n_events);
}
n_events++;
}`

相关内容