函數(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