solidity基础-函数
定义
function 关键字声明,是合约中的可执行单元,一个函数的完整定义如下
function (funcName) (<parameter types) {public | external | internal | private} [constant | view payable] [returns (<return types>)] {
// do something
}
调用
- internal:内部调用
- external:外部调用,使用 合约实例.函数名方式调用
构造函数
使用构造函数关键字(constructor)定义,没有函数名。构造函数是一个可选函数,用于初始化合约的状态变量。构造函数可以是内部的或公共的,内部构造函数将合约标记为抽象的
constructor() <访问修饰符> {
// do something
}
函数可见性visibility
solidity为函数提供了四种可见性:external、public、internal、private
external
- 声明为 external 的函数可以从其他合约来进行调用,所以声明为 external 是合约对外接口的一部分
- 不能以 internal 的方式进行调用
- 有时在接收大的数据数组时性能更好
public
- 函数默认声明为 public
- public 的函数既允许以 internal 的方式调用,也允许以 external 的方式调用
- public 的函数由于允许被外部合约访问,是合约对外接口的一部分
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Demo {
function funcA() public pure returns (string memory) {
return "function A";
}
function funcB() public view {
// 以 internal 的方式调用函数
funcA();
// 以 external 的方式调用函数
this.funcA();
}
}
internal
- 在当前合约或继承的合约中,只允许以 internal 的方式调用
private
- 只能在当前合约中内访问
函数的状态可变性mutability
- view:用 view 声明的函数只能读取状态不能修改状态
- pure:用 pure 声明的函数既不能读取状态也不能修改状态
- payable:用 payable 声明的函数可以接受发送给合约的以太币,如果未指定,该函数将自动拒绝所有发送给它的以太币
函数的返回值 returns / return
方式一:returns + return
- returns 加在函数名后面,用于声明返回的变量类型和变量名
- return 用于函数主体中,返回指定的变量
function funcA() public pure returns (string memory) {
return "function A";
}
方式二:命名方式返回
我们可以在 returns 中标明返回变量的名称,这样 solidity 会自动给这些变量初始化,并且自动返回这些变量的值,不需要再加 return
function funcA() public pure returns (string memory res) {
res = "function A";
}
函数的重载
solidity 中允许函数进行重载,即名字相同但输入参数不同的函数可以同时存在,他们被视为不同函数。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Demo {
function func(uint8 a) external pure returns (uint8) {
return a;
}
function func(bytes memory a) external pure returns (bytes memory) {
return a;
}
}