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

函数在所有的语言中都是一种常见类型。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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容