智能合约中我们提到的状态变量,可以认为是一个类中的变量(开发同学容易理解)
// file Storage.sol
contract Storage {
// 状态变量
uint256 public number;
function test(uint256 a) public virtual returns (uint256) {
return a;
}
}
// file StorageFactory.sol
import "./Storage.sol"
contract StorageFactory is Storage {
// 这里会有一个warning error提示:
//Warning: Function state mutability can be restricted to pure ......
function test(uint256 a) public override returns (uint256) {
return a + 10;
}
}
这里的warning提示大致的意思是,如果没有使用到本合约或者父合约的状态变量,需要添加pure修饰符, 像如下:
function test(uint256 a) public pure override returns (uint256) {
return a + 10;
}
当然,如果函数内是这种写法,引用了状态变量,但不是修改其值
// 这里依然会有一个warning error提示:
// Warning: Function state mutability can be restricted to view ....
function test(uint256 a) public override returns (uint256) {
// 这里的number就是父类中的状态变量number
return number + a;
}
这里的提示是表示如果你引用了本合约或者父合约的状态变量,需要添加view修饰符,想如下
function test(uint256 a) public view override returns (uint256) {
// 这里的number就是父类中的状态变量number
return number + a;
}
pure和view修饰符是用来限制合约状态变量使用的,如果不加修饰符,是会有警告提示,但是不影响编译后的执行的。以上的例子其实不局限于继承关系,常规的单合约也有这个限制。
网友评论