Programming languages 在使用稳定的索引时,是否需要特定的条件? pragma-solidity^0.4.0; 合同A{ 字节[10]arr; 函数setElement(uint索引,字节值)公共{ require(index>=0&&index=0&&index=x.length或i

Programming languages 在使用稳定的索引时,是否需要特定的条件? pragma-solidity^0.4.0; 合同A{ 字节[10]arr; 函数setElement(uint索引,字节值)公共{ require(index>=0&&index=0&&index=x.length或i,programming-languages,blockchain,ethereum,solidity,Programming Languages,Blockchain,Ethereum,Solidity,据我所知,断言样式异常是在以下情况下生成的,而不仅仅是: 如果访问的数组的索引太大或为负(即x[i],其中i>=x.length或i

据我所知,断言样式异常是在以下情况下生成的,而不仅仅是:

  • 如果访问的数组的索引太大或为负(即x[i],其中i>=x.length或i<0)
但是我应该每次都检查情况吗


另外,我想将剩余的气体退还给执行人。

您正确使用了它
require
用于检查输入参数,而
assert
用于验证合同的内部内容(主要用于测试目的)。如果
require
条件失败,剩余的气体将被退还

从:

便利函数assert和require可用于检查 条件,如果不满足该条件,则引发异常。这个 assert函数只能用于测试内部错误,以及 检查不变量。应使用require函数来确保 满足有效条件,如输入或合同状态变量, 或者验证调用外部合约的返回值

pragma solidity ^0.4.0;

contract A{
    byte[10] arr;

    function setElement(uint index, byte value) public {
        require(index >= 0 && index < arr.length); //Should I leave it as is?
        arr[index] = value;
    }

    function getElement(uint index) view public returns (byte) {
        require(index >= 0 && index < arr.length); //Or not?
        return arr[index];
    }
}