一,solidity中的函数 基本格式是:
function (HelloSolidity) [internal|external] [pure|view|payable] returns (string){
}
-
function:声明函数时的固定用法,想写函数,就要以function关键字开头。
-
(HelloSolidity):圆括号里写函数的参数,也就是要输入到函数的变量类型和名字。
-
{internal|external|public|private}
:函数可见性说明符,一共4种。没标明函数类型的,默认internal
。public
: 内部外部均可见。(也可用于修饰状态变量,public变量会自动生成getter
函数,用于查询数值).private
: 只能从本合约内部访问,继承的合约也不能用(也可用于修饰状态变量)。external
: 只能从合约外部访问(但是可以用this.f()
来调用,f
是函数名)internal
: 只能从合约内部访问,继承的合约可以用(也可用于修饰状态变量)。
-
[pure|view|payable]
:决定函数权限/功能的关键字。payable(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入ETH
。 -
returns(string):函数返回的变量类型和名称。(此处是字符串)
二,函数的修饰符 pure和view
我刚开始学solidity的时候,一直不理解pure和view关键字,因为别的语言没有类似的关键字。solidity加入这两个关键字,编出程序也要注重gas fee的节省,要不然写出的项目,会因为gas的原因而凉。合约的状态变量存储在链上,gas free很贵,如果不改写链上变量,就不用付gas。调用pure和view的函数是不需要付gas的。
函数实际上没有改变solidity的状态,即没有改变任何值和任何东西,这种情况下,我们可以把函数定义成view,意味着它只能读取数据不能更改数据。
function HelloSolidity() public view returns(string){}
同样支持pure函数,表明不能读取也不能写入存储在链上的状态变量。
不写pure和view即函数既可以读取也可以写入状态变量。接下来直接看代码吧!
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract FunctionTypes{
uint256 public number = 5;
function add() external{
number = number + 1;
}
如果add()函数是function add() pure external returns(),就会报错,因为pure不能读取也不能写入,pure还是有很大用处的。例如我们此处可以换一种来写。
function addPure(uint256 _number) external pure returns(uint256 new_number){
new_number = _number+1;
}
即传递参数_number,让_number+1。
如果add()函数是function add() external view retruns(),这也会报错,因为view可以读取但不能写入。这里我们可以改代码即不改值,而返回新变量。
function addView() external view returns(uint256 new_number) {
new_number = number + 1;
}
三,函数的可见性——internal(内)和external(外)
interal和private类似,不过如果某个合约继承自其父合约,这个合约就可以访问父合约,同样的也可访问其内部函数。external和public类似,只不过这些函数只能在合约之外调用,他们不能被合约内的其他函数调用。