Solidity 从入门到实战(四)

Solidity 从入门到实战(四)

注意:本专栏主要参考于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记以及https://blog.csdn.net/weixin_45067603/article/details/105751748

函数重载

函数重载是指函数命名相同,参数列表不同,即需要满足以下两个条件之一
1.函数传入参数类型不同
2.函数传入参数数量不同

pragma solidity ^0.4.16;

contract funTest{
    
    uint public test= 0;
      
    function fun1(uint num1,uint num2) {
        test = 10;
    }
    
    
    function fun1(uint num1) {
        test = 20;
    }
    
    function fun2(uint a) {
        test = 100;
    }

    function fun2(string a) {
         test = 200;
    }

    function fun3(address a) {
        test=1000;
    }
    
    
    function fun3(uint160 a){
        test=2000;
    }

    function fun4(uint8 a){
         test=10000;
    }
    
    
    function fun4(uint16 a){
        test=20000;
    }

    function fun1test() public view returns(uint){
        fun1(1,2);
        return test;
    }
    
     function fun2test() public view returns(uint){
        fun2('asdasd');
        return test;
    }
    
    function fun3test() public view returns(uint){
        fun3(0x3e805eC48BdFBc458e7446058F94a315896A1cF6);
        //仅使用address类型,可以运行并运行address参数的重载函数
        return test;
    }
    
 // function fun3test2() public view returns(uint160){
        //uint160  如果转化成uint160类型并运行,那么报错          
        //temp=uint160(0x3e805eC48BdFBc458e7446058F94a315896A1cF6);
        //fun3(temp);
        //return temp;
   // }
    //**会出现下图的错误**
   
    function fun4test() public view returns(uint){
        fun4(256);
        return test;
    }
   
    
    function reset() public{
        test = 0;
    }
    

}

在这里插入图片描述

在这里插入图片描述

函数传入参数

主要有两种方法进行传参
1.可以直接对传入对应参数的值
2.格式 函数名({类型1:value1,类型2:value2,…,类型n:valuen})
3.调用函数的时候必须传入所有参数,否则会报错

pragma solidity ^0.4.16;

contract funTest{
    
    uint public num;
    string public teststring;
    
    function setvalue(uint num1,string teststring1){
        num=num1;
        teststring = teststring1;
    }
    
    function test1(){
        setvalue(1,'a');
    }
    
    function test2(){
        setvalue({num1:1,teststring1:'a'});
    }
    
    function test3(){
        setvalue({teststring1:'a',num1:1});
    }
    
    // function wrongtest4(){
    //    setvalue(1); 编译会报错
    //}
    
}

在这里插入图片描述

函数返回值

1.与go语言类似,solidity可以有多个返回值,可以命名(类型1 value1,类型2 value2,…,类型n valuen)
2.其它性质都类似于其它语言的特性

pragma solidity ^0.4.16;

contract returnTest{
    function test1() public view returns(uint8 num1,uint8 num2,string teststring){
       //直接赋值,最后可以看到返回值就是赋的值
        num1=1;
        num2=2;
        teststring='hello';
    }
    
    function test2() public view returns(uint8 num1,uint8 num2,string teststring){
        return (10,20,'hello2');//可以直接进行返回
    }
    
    function test3() public view returns(uint8 num1,uint8 num2,string teststring){
        num1=1;
        num2=2;
        teststring='hello';
        return (10,20,'hello2');//如果又赋值又返回,那么以return的值为准
    }
    
    function test4() public view returns(uint8 num1,uint8 num2,string teststring1,string teststring2){
        teststring1='testnb1';
        teststring2='testnb2';
        //return (10+20,10*20,'hello2',teststring1+teststring2);//solidity不支持string的直接拼接
        return (10+20,10*20,teststring1,teststring2);
    }
}

在这里插入图片描述

变量的作用域

注意:不要在函数内部重新定义一个和函数形参一样的变量

pragma solidity ^0.4.16;

contract areaTest{
    uint public a=1;
    function areatest1(uint a) public view returns(uint){
        a=10;
        return a;
    }
    
    
    function areatest2(uint a) public view returns(uint){
        a=10;
        //重新定义a,会出现下图的错误
    //   for(uint a=0;a<10;a++){
            
    //     }
        return a;
    }
    
    function areatest3() public  returns(uint){
    //此代码会改变全局变量a的值
        a++;
        return a;
    }
    
    function areatest4(uint a) public  returns(uint){
    //此变量只是局部变量,函数执行结束之后就销毁
        a++;
        return a;
    }
    function areatest5() public  returns(uint){
     //此时重定义a是可行的,覆盖全局变量a的值
     uint a;
     a=100;
     return a;
    }
    
}

在这里插入图片描述

在这里插入图片描述

constant 关键字

1.函数内部的constant关键字,在4.x版本中它和view是等价的,在5.0版本中将不能使用
2.全局变量、constant属性、局部变量是没有这个属性的。
3.全局变量加上了constant属性,就不能被修改。
4.当前版本支持int,uint,string,bytes1–bytes32 能够使用constant。

pragma solidity ^0.4.16;
contract constantTest{
    uint public constant a=1;
    //function changetest() public{
    //    a=2; 函数内试图修改,结果编译报错
    //}
    // function changetest() public{
    //     uint constant test=2; //函数内无法声明constant变量
    // }
    int public constant b=2;
    bytes32 public constant c=0x232334224;
    string public constant d='ttttest';
    
}

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟逆袭之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值