solidity函数的表达通式:
function (<parameter types>) {internal|external} [pure|view|payable] [returns (<return types>)]
{internal|external|public|private} :函数可见性说明符,一共4种。
public: 内部外部均可见,并且自动给stoage变量生成 getter 函数 ;private: 只能从本合约内部访问,继承的合约也不能用;external: 只能从合约外部访问(但是可以用this.f()来调用,f是函数名);internal: 只能从合约内部访问,继承的合约可以用;
// private: 内部
function privateCall() private {
number = number - 1;
}
// internal: 内部
function internalCall() internal {
number = number - 1;
}
// 合约内的函数可以调用内部函数
function externalCall() external {
internalCall();
}
// 合约内的函数可以调用内部函数
function publicCall() public {
internalCall();
}
function testCall() public{
privateCall();
internalCall();
this.externalCall();
}
决定函数权限/功能的关键字。
payable的函数,运行的时候可以给合约转入ETH。
pure 和 view,合约的状态变量存储在链上,gas fee很贵,如果不改写这些变量,就不用付gas。调用pure跟view的函数是不需要付gas的。
pure,不能读取也不能写入存储在链上的状态变量
view,能读取但也不能写入状态变量
不写pure也不写view,函数既可以读取也可以写入状态变量
//pure view payable
// 默认
function add() external{
number = number + 1;
}
// pure
function pureAdd(int paraNumber) external pure returns(int newNumber){
// number = number + 1;//报错,无法访问number
newNumber = paraNumber + 1;//报错,无法访问number
}
// view
function viewAdd(int paraNumber) external view returns(int newNumber){
// number = number + 1;//报错,无法改写number
newNumber = number + paraNumber + 1;//报错,无法访问number
}
// payable: 递钱,能给合约支付eth的函数
function minusPayable() external payable returns(uint256 balance) {
internalCall();
balance = address(this).balance;
}
函数返回的变量类型和名称。
// pure
function pureAdd(int paraNumber) external pure returns(int newNumber){
newNumber = paraNumber + 1;//报错,无法访问number
}
//return
function returnFunc() external view returns(int returnNum){
int testNum = this.pureAdd(3) + 1;
returnNum += testNum;
}
函数支持重载,即名字相同但输入参数类型不同的函数可以同时存在,他们被视为不同的函数。
function saySomething() public pure returns(string memory){
return("Nothing");
}
function saySomething(string memory something) public pure returns(string memory){
return(something);
}
这节介绍了函数的可见性说明、功能权限和返回值的使用,下节我们介绍变量的数据存储和作用域。
全部代码:
https://github.com/Luca-Hsu/SuperSolidity/blob/main/03_Function/Function.sol
Reference:
https://mirror.xyz/ninjak.eth/FWI887JBea4VpNiMlJ2ICyJ5aWUREReGo9Bz0X8iEVc

