• 三、流程控制及循环《2022 solidity8.+ 版本教程到实战》


    一、流程控制

    solidity 中使用 if 语句对流程进行控制,用法跟C类风格编程语言类似,例如如下是一个使用 if 语句的示例:

    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.0;
    contract IfDemo{
        function checkVal(uint iVal) external pure returns(uint){
            if (iVal>9 && iVal!=10){
                return 1;
            }else if(iVal < 10){
                return 2;
            }else{
                return 3;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在以上代码中,我们还看到了使用 if 语句时可以使用逻辑判断符对其进行多个条件的判断,其函数传入了一个参数 iVal 是uint 类型值,方式也跟 C 语言或者 JS 中类似,在此不再赘述。

    二、循环

    solidity 中循环也跟C和JS 中类似,如下是示例:

    function Floop()external pure returns(uint){
        uint sum=0;
        for(uint i=0;i<10;i++){
            sum+=i;
        }
        return sum;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    当然也支持 while 循环:

    function Wloop()external pure returns(uint){
         uint i=0;
         while(i<10){
             i++;
         }
         return i;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在此还需要注意,循环会消耗 Gas,循环次数也跟 Gas 消耗成正比,需要谨慎使用,控制运行效率。

    四、错误

    在 solidity 中,可使用 require、revert 进行自定义报错。

    例如在第三点中的示例中,当 i 的值等于 4 时则执行报错:
    在这里插入图片描述
    此时部署合约,点击Floop执行后:
    在这里插入图片描述
    注意,报错后若在之前有状态变量被更改将会回滚数据。

    revert:
    在这里插入图片描述

    节省 Gas 的 err 方法

    err 方法有一种节省 Gas 的方式就是自定义 Err,通过 error 指定一个 error 方法,可接收对应的参数,当满足报错条件后使用 revert 对error 方法进行调用即可:

    error TestError(string info,address caller);
      function ErrDemo(uint i)external view{
          if(i<10){
              revert TestError("value err",msg.sender);
          }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此时我们传入 1 后,将会报错:
    在这里插入图片描述

    传入其他值(大于10)则成功调用:
    在这里插入图片描述

  • 相关阅读:
    Xline 源码解读(四)—— CURP 状态机引擎
    手写深度学习之优化器(SGD、Momentum、Nesterov、AdaGrad、RMSProp、Adam)
    Java毕业设计 基于SSM的网上图书商城系统
    --端口--
    聊聊ElasticeSearch并发写的乐观锁机制
    [开学]Vuex详解
    算法分析与设计(持续更新……)
    Linux环境变量
    redis系列之——高可用(主从、哨兵)
    第八章 动态规划 5 AcWing 1591. 快速排序
  • 原文地址:https://blog.csdn.net/A757291228/article/details/126762909