函数
函数定义
符合格式: function 函数名(参数类型 参数名) 修饰符 returns(返回值类型) {}
例如
function add (uint a, uint b) returns(uint){
return a + b;
}
返回值
- 使用关键字
returns
确定返回值 - 支持多返回值
returns
支持赋予返回值值名称,此时不需要显示指定return
- 使用关键字
multipleReturns
时可以不写returns
function returnMany() public pure returns(uint, bool, uint) {
return (1, true, 2);
}
// 隐式返回
function assigned() public pure returns(uint x, bool b, uint y) {
x = 10;
b = false;
y = 10;
}
function multipleReturns () {
uint a;
uint b;
uint c;
(a, b, c) = multipleReturns()
}
Modifier
Modifier
是可以在函数调用之前运行的代码, 相当于函数的运行前的 hook
// 定义 modifier 要求执行人必须是合约的所有者
// _;表示执行函数体内的代码
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_; // 调用 onlyOwner 的函数的内部代码
}
modifier validAddress(address _addr) {
require(_addr != address(0), "Not valid address");
_;
}
// 执行该函数前会先去执行 onlyOwner 和 validAddress, 如果都通过则才会去执行后续代码
function changeOwner(address _newOwner) public onlyOwner validAddress(_newOwner) {
owner = _newOwner;
}
pure / view
view
告诉我们运行这个函数不会更改和保存任何数据, 用于读取链上数据pure
告诉我们这个函数不但不会往区块链写数据,它甚至不从区块链读取数据。
这两种在被从合约外部调用的时候都不花费任何 gas
contract ViewAndPure {
uint public x = 1;
// 没有修改链上的数据x, 仅仅只是读取x的值
function addToX(uint y) public view returns (uint) {
return x + y;
}
// 没有修改链上的数据, 也没有读取链上的值x
function add(uint i, uint j) public pure returns (uint) {
return i + j;
}
}