我收到错误 - 如果数组是空洞的,而 运行 合同,则元素类型必须可以为空

I am getting error - Element type must be nullable if array is holey while running the contract

{ “error”:“wasm 执行失败,出现错误:FunctionCallError(HostError(GuestPanic { panic_msg: “如果数组是空洞的,元素类型必须可以为空,文件名:\”~lib/array.ts\”行: 103 列:40" }))", “日志”:[], “block_height”:82571830, “block_hash”:“2grrzf57dPYQfnyUJZB7jw2zdqe7XsxBZBAdoSZ5wNMa” }

代码

for(let i:i32 =0 ; i < reviews.length ; i++)
{
   let condition = reviews[i].restaurant.restaurant_name==restaurantName;
   if(condition)
   {
      reviews_[i] = reviews[i].review;

   }
    
}

return reviews_;

}

我认为由于 for 循环中的条件,此函数会在数组中产生“空洞”。您可以创建一个空的 reviews_ 数组,而不是对 reviews_reviews 使用相同的长度,并将元素推送到它(参见下面的示例 getShortList

有一个空洞的列表看起来像这样

[review1, , , , review5, review6, , review8];

不是使用未知元素,而是必须用 null-able 元素填充空白,例如空洞的评论

[review1, emptyReview, emptyReview, emptyReview, review5, review6, emptyReview, review8];

或者只是确保列表只包含数组中没有任何“空洞”的元素(“压缩”数组)

[review1, review5, review6, review8];

考虑以下示例

// Will panic at runtime due to holes in the list
getListWithHoles(): string[] {
  const arr = new Array<string>(5);
  for (let i = 0; i < arr.length; ++i) {
    if (i > 2) {
      arr[i] = "";
    }
  }
  return arr; // will return [,,,"",""];
}

// Here's how we can fix it. Return a "packed" array
getShortList(): string[] {
  const arr: string[] = [];
  for (let i = 0; i < 5; ++i) {
    if (i > 2) {
      arr.push("");
    }
  }
  return arr; // will return ["",""];
}