三分鐘入門區(qū)塊鏈語言Solidity函數(shù)|入門系列

函數(shù)在所有的語言中都是一種常見類型。Solidity中的函數(shù)關(guān)鍵字是function,我們先來看一個最簡單的例子:

pragma solidity ^0.4.0;

contract SimpleFunc {
    function hello(uint i){
        //todo
    }
}

這樣我們就學(xué)會了函數(shù)的編寫。將上述代碼復(fù)制到在線的瀏覽器編譯器:https://ethereum.github.io/browser-solidity/ 中運行,就能立即看到效果。

函數(shù)的參數(shù)

函數(shù)的入?yún)⒍x與變量類似。我們可以省略未使用到的參數(shù)變量名,如下例所示:

pragma solidity ^0.4.0;

contract Simple {
    //函數(shù)的入?yún)⑷缱兞康亩x方式
    //未使用的參數(shù)可以省略變量名
    function InputPara(uint a, uint) {
       a = a + 1;
    }
}

例子中我們按變量定義的方式定義了uint a。由于我們在函數(shù)中未使用到第二個參數(shù),省略了第二個參數(shù)的變量名。

命名參數(shù)

函數(shù)調(diào)用可以使用命名參數(shù)。將參數(shù)名和參數(shù)值這樣的鍵值對以任意順序放進{}即可。請確認所傳參數(shù)一定要與定義的一致。下面來看個簡單的例子:

pragma solidity ^0.4.0;

contract C {
    //交換傳入值的順序并返回
    function f(uint key, uint value) returns (uint, uint){ 
        return (value, key);
    }

    function g() returns (uint, uint){
        //任意順序的通過變量名來指定參數(shù)值
        return f({value: 2, key: 1});//2,1
    }
}

通過指定參數(shù)名稱,實際傳入的值為1,2,通過調(diào)用f()函數(shù),我們得到了交換順序后的2,1。

函數(shù)的返回值

返回值的定義與參數(shù)類似,跟在returns關(guān)鍵字后即可。

pragma solidity ^0.4.0;

contract Simple {
    //定義了一個返回值變量`r`
    function outputParameter(uint a, uint b) returns (uint r){
       r = a + b;
    }
}

上例中,我們定義了一個返回值變量uint r,并在函數(shù)內(nèi)讓r = a + b;,從而返回了結(jié)果。

return關(guān)鍵字

我們還可以使用return關(guān)鍵字來指定返回的值,使用return時,我們不會用到返回值的變量名稱,可以省略。

pragma solidity ^0.4.0;

contract Simple {
    
    //使用`return`關(guān)鍵字指定返回值
    function output1(uint a, uint b) returns (uint r){
        return a + b;
    }
    
    //省略返回參數(shù)的變量名定義
    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關(guān)鍵字來指定要返回的值;在output2()中我們省略了返回參數(shù)的變量名定義;一旦使用了return的定義方式,我們要保證return返回的參數(shù)數(shù)量要與定義匹配,如output3()所示。從output4()中我們可以看出來,如果同時使用return關(guān)鍵字和變量定義方式,以return為準。

返回多個值

Solidity語言支持在一個函數(shù)中返回多個結(jié)果。使用return (v0, v1, ... vn);來返回多個值。

pragma solidity ^0.4.0;

contract Simple {
    //返回多個值
    function returnMul(uint a) returns (uint, uint){
        return (a, a + 1);
    }
}

上述函數(shù)返回了原值,和原值加一后的新值兩個結(jié)果。

雜項

返回參數(shù)會被初始化為0,如果沒有被明確的設(shè)置值,那么它會一直保持零。

函數(shù)的參數(shù)和返回值可以在函數(shù)體內(nèi)被用作表達式的一部分。當(dāng)然他們也可被賦值,由于基本類型是值傳遞,所以即使變量被修改為新值,也不會影響函數(shù)外的調(diào)用原值。

pragma solidity ^0.4.0;

contract Simple {
    
    function f(uint a) returns (uint){
        //修改傳入的參數(shù)變量,并返回
        a = a + 1;
        return a;
    }
    
    function callFun() returns (uint, uint){
        uint i = 1;
        //傳入的參數(shù)`i`并沒有被改變
        uint j = f(i);
        return (i, j);//1,2
    }
}

我們看到在調(diào)用f()時傳入了i,并在函數(shù)內(nèi)修改了它的值;但函數(shù)f()函數(shù)調(diào)用完成后,i仍為1。

函數(shù)的高級特性

由于Solidity語言本身是一門基于區(qū)塊鏈網(wǎng)絡(luò)的分布式語言。它還支持跨合約函數(shù)調(diào)用的可見性控制,函數(shù)級別貨幣支付支持,函數(shù)級的訪問控制等獨有特性。我們將在下一節(jié)的高級特性中進行進一步的講解。

關(guān)于作者

專注基于以太坊的相關(guān)區(qū)塊鏈技術(shù),了解以太坊,Solidity,Truffle。
博客:http://me.tryblockchain.org
Solidity中文翻譯:http://solidity.tryblockchain.org

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容