Array

contract Array {
  // storage array 定义
  // 注意区分后面的 memory array 定义
  uint[] public numDynamic = [1]; // 动态长度
  uint[3] public numFixed = [4]; // 定长, 不能越界, 无 push 和 pop 操作
  
  function demo() external {
    // 操作
    numDynamic.push(4); // 末尾追加
    numDynamic.pop(); // 末尾删除
    
    // 数组长度, 定长数组一直返回定长长度
    uint256 len = numDynamic.length;
    
    uint256 v = num[0]; // 取值
    num[0] = 123; // 修改
    delete num[0]; // 删除(将该位置设置为 0, 后面数字不向前补位)
    
    // memory array 定义
    // 必须是定长(.length 一定), 没有 push, pop 操作, 默认全是 0
    uint[] memory num = new uint[](5);
  }
  
  // 函数返回数组需要使用 memory 修饰, 将 state 复制到 memory 后返回
  // 不推荐函数返回数组, 就像不推荐使用 loop 一样, 会随着长度增加消耗太多 gas, 导致函数不可用.
  function foo() external returns (uint256[] memory) {}
  function remove(uint _index) public {
    require(_index < arr.length, "index out of upper bound");
    //for (uint i = _index; i < arr.length - 1; i++) {
    //  arr[i] = arr[i+1];
    //}
    arr[_index] = arr[arr.length-1];
  
    arr.pop();
  }
}

Remix 尝试一下?!

Last updated

Was this helpful?