function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]
-
对上述函数表达式进行解释:
-
function
:声明函数时的固定用法。要编写函数,就需要以function
关键字开头。 -
<function name>
:函数名。 -
(<parameter types>)
:圆括号内写入函数的参数,即输入到函数的变量类型和名称。 -
{internal|external|public|private}
:函数可见性说明符,共有4种。public
:内部和外部均可见。private
:只能从本合约内部访问,继承的合约也不能使用。external
:只能从合约外部访问(但内部可以通过this.f()
来调用,f
是函数名)。internal
: 只能从合约内部访问,继承的合约可以用。
注意 1:合约中定义的函数需要明确指定可见性,它们没有默认值。
注意 2:
public|private|internal
也可用于修饰状态变量。public
变量会自动生成同名的getter
函数,用于查询数值。未标明可见性类型的状态变量,默认为internal
。 -
[pure|view|payable]
:决定函数权限/功能的关键字。payable
(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入 ETH。pure
和view
的介绍见下一节。 -
[returns ()]
:函数返回的变量类型和名称。
-
pure和view关键字可能令人费解,因為其他程式语言中没有类似的关键字。 solidity引入这连个关键字主要是因为以太坊交易需要支付气费(gas fee)。 合约的状态变数存储在链上,gas fee 很贵,如果计算不改链上的状态,就可以不用付gas。
- pure: pure 函数既不能读取也不能写入链上的状态变数。
- view:view 函数能读取但也不能写入链上的状态变数。
在以太坊中,以下语句被视为修改链上状态:
- 写入状态变量。
- 释放事件。
- 创建其他合约。
- 使用
selfdestruct
. - 通过调用发送以太币。
- 调用任何未标记
view
或pure
的函数。 - 使用低级调用(low-level calls)。
- 使用包含某些操作码的内联汇编。
returns
:跟在函数名后面,用于声明返回的变量类型及变量名。return
:用于函数主体中,返回指定的变量。
// 命名式返回
function returnNamed() public pure returns(uint256 _number, bool _bool, uint256[3] memory _array){
_number = 2;
_bool = false;
_array = [uint256(3),2,1];
}
// 命名式返回,依然支持return
function returnNamed2() public pure returns(uint256 _number, bool _bool, uint256[3] memory _array){
return(1, true, [uint256(1),2,5]);
}
- 解构赋值用
,
隔开,按顺序排列,不读取的留空。
(, _bool2, ) = returnNamed();