美文网首页以太坊开发笔记专注学习区块链技术solidity
三分钟入门区块链语言Solidity函数|入门系列

三分钟入门区块链语言Solidity函数|入门系列

作者: TryBlockchain | 来源:发表于2017-03-12 16:38 被阅读3837次

    函数在所有的语言中都是一种常见类型。Solidity中的函数关键字是function,我们先来看一个最简单的例子:

    pragma solidity ^0.4.0;
    
    contract SimpleFunc {
        function hello(uint i){
            //todo
        }
    }
    

    这样我们就学会了函数的编写。将上述代码复制到在线的浏览器编译器:https://ethereum.github.io/browser-solidity/ 中运行,就能立即看到效果。

    函数的参数

    函数的入参定义与变量类似。我们可以省略未使用到的参数变量名,如下例所示:

    pragma solidity ^0.4.0;
    
    contract Simple {
        //函数的入参如变量的定义方式
        //未使用的参数可以省略变量名
        function InputPara(uint a, uint) {
           a = a + 1;
        }
    }
    

    例子中我们按变量定义的方式定义了uint a。由于我们在函数中未使用到第二个参数,省略了第二个参数的变量名。

    命名参数

    函数调用可以使用命名参数。将参数名和参数值这样的键值对以任意顺序放进{}即可。请确认所传参数一定要与定义的一致。下面来看个简单的例子:

    pragma solidity ^0.4.0;
    
    contract C {
        //交换传入值的顺序并返回
        function f(uint key, uint value) returns (uint, uint){ 
            return (value, key);
        }
    
        function g() returns (uint, uint){
            //任意顺序的通过变量名来指定参数值
            return f({value: 2, key: 1});//2,1
        }
    }
    

    通过指定参数名称,实际传入的值为1,2,通过调用f()函数,我们得到了交换顺序后的2,1

    函数的返回值

    返回值的定义与参数类似,跟在returns关键字后即可。

    pragma solidity ^0.4.0;
    
    contract Simple {
        //定义了一个返回值变量`r`
        function outputParameter(uint a, uint b) returns (uint r){
           r = a + b;
        }
    }
    

    上例中,我们定义了一个返回值变量uint r,并在函数内让r = a + b;,从而返回了结果。

    return关键字

    我们还可以使用return关键字来指定返回的值,使用return时,我们不会用到返回值的变量名称,可以省略。

    pragma solidity ^0.4.0;
    
    contract Simple {
        
        //使用`return`关键字指定返回值
        function output1(uint a, uint b) returns (uint r){
            return a + b;
        }
        
        //省略返回参数的变量名定义
        function output2(uint a, uint b) returns (uint){
            return a + b;
        }
        
        /*
        function output3(uint a, uint b) returns (uint x, uint mul){
            x = a + b;
            mul = a * b;
            //不能混合使用两种定义方式
            //使用`return`时要返回所有定义
            //Untitled3:18:9: Error: Different number of arguments in return statement than in returns declaration.
            return x;
        }
        */
        
        function output4(uint a, uint b) returns (uint mul){
            mul = a * b;
            //不能混合使用两种定义方式
            //使用`return`时要返回所有定义
            //Untitled3:18:9: Error: Different number of arguments in return statement than in returns declaration.
            return 1;//1
        }
    }
    

    我们在output1()中使用了return关键字来指定要返回的值;在output2()中我们省略了返回参数的变量名定义;一旦使用了return的定义方式,我们要保证return返回的参数数量要与定义匹配,如output3()所示。从output4()中我们可以看出来,如果同时使用return关键字和变量定义方式,以return为准。

    返回多个值

    Solidity语言支持在一个函数中返回多个结果。使用return (v0, v1, ... vn);来返回多个值。

    pragma solidity ^0.4.0;
    
    contract Simple {
        //返回多个值
        function returnMul(uint a) returns (uint, uint){
            return (a, a + 1);
        }
    }
    

    上述函数返回了原值,和原值加一后的新值两个结果。

    杂项

    返回参数会被初始化为0,如果没有被明确的设置值,那么它会一直保持零。

    函数的参数和返回值可以在函数体内被用作表达式的一部分。当然他们也可被赋值,由于基本类型是值传递,所以即使变量被修改为新值,也不会影响函数外的调用原值。

    pragma solidity ^0.4.0;
    
    contract Simple {
        
        function f(uint a) returns (uint){
            //修改传入的参数变量,并返回
            a = a + 1;
            return a;
        }
        
        function callFun() returns (uint, uint){
            uint i = 1;
            //传入的参数`i`并没有被改变
            uint j = f(i);
            return (i, j);//1,2
        }
    }
    

    我们看到在调用f()时传入了i,并在函数内修改了它的值;但函数f()函数调用完成后,i仍为1

    函数的高级特性

    由于Solidity语言本身是一门基于区块链网络的分布式语言。它还支持跨合约函数调用的可见性控制,函数级别货币支付支持,函数级的访问控制等独有特性。我们将在下一节的高级特性中进行进一步的讲解。

    关于作者

    专注基于以太坊的相关区块链技术,了解以太坊,Solidity,Truffle。
    博客:http://me.tryblockchain.org
    Solidity中文翻译:http://solidity.tryblockchain.org

    相关文章

      网友评论

      • 汇兄:分享个以太坊dapp开发的教程给区块链新手:
        http://xc.hubwiz.com/course/5a952991adb3847553d205d1?affid=20180327jianshu
      • Eric_P:如果 自己看 也就罢了 还敢公布出来 谋财害命 真是羞煞先人
        Eric_P:@宛丘之上兮 既然自己没有七成以上的把握 为什么要起这么炫的名字 只能把整体的水平拉低 做学问 不是为了出名 而是真才实学的分享 不是一些不入流的文章 充斥着国内IT届 知道为什么国内 没有好的文章吗 技术水平差 实践少 没有进取心 外语差 翻译国外的文章翻译不好 很多程序员 多是从国外优秀文章拿来主义 而且只拿结果不拿过程 虽然临时解决了问题 留下了大患 国内程序员普遍水平差劲 而且基础或者进阶的 书籍 多是外语 (英语 日语 等等) 国内技术大神 多都有一技藏身 不愿透露 没有共享精神 慢慢就被淘汰掉了 要么分享的文章遮遮掩掩 要么非常之片面 期待那些大神能够将哪些自己总结的经验贡献出来 国内IT相关知识分享泛滥 整体水平差 每个IT人士都有责任 谁都不能免责 对于自己没有把握的文章 或者 没有用心去分享的文章 浪费读者时间 如果读的人越多 就是在浪费大家的生命 通过酷炫的文章名字来吸引读者浪费读者的时间达到自己的文章的阅读量 是不是在谋财害命 既然在不断学习 为何不谦虚些
        宛丘之上兮:别人写错了你可以指出来,说别人谋财害命是错的,都在不断学习
      • Eric_P:自己一知半解 还敢 出文章 说三分钟 简直了 林子大了 什么鸟也敢称大王了 无法无天了

      本文标题:三分钟入门区块链语言Solidity函数|入门系列

      本文链接:https://www.haomeiwen.com/subject/gqtxnttx.html