# Solidity 课程3:函数类型 **Published by:** [Novar](https://paragraph.com/@novar/) **Published on:** 2022-05-15 **URL:** https://paragraph.com/@novar/solidity-3 ## Content solidity函数的表达通式:function (<parameter types>) {internal|external} [pure|view|payable] [returns (<return types>)] 1、{internal|external}{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(); } 2、[pure|view|payable]决定函数权限/功能的关键字。 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; } 3、[returns ()]函数返回的变量类型和名称。// 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; } 4、重载函数支持重载,即名字相同但输入参数类型不同的函数可以同时存在,他们被视为不同的函数。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 ## Publication Information - [Novar](https://paragraph.com/@novar/): Publication homepage - [All Posts](https://paragraph.com/@novar/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@novar): Subscribe to updates