最近在学智能合约的编写,其中,对constant view pure的认识很模糊,于是查了些资料总结一下。
首先,这三个修饰词都意味着不需要消耗gas。
1、constant 常量,意味着不可变化。可以读取状态变量但是不能改。不是所有的类型都支持常量,它只能修饰值类型的变量和字符串。
pragma solidity ^0.4.20;
contract Test {
uint public m1 = 2; //普通uint类型
uint constant m2 = 2;//constant修饰的uint常量
string str1 = "string1";//普通string类型
string constant str2 = "string2";//constant修饰的string常量
function f1() public {
m1 = 20;
// m2 = 20; // 出错,无法修改constant修饰的常量(值类型)
str1 = "String1!";
// str2 = "String2!"; // 出错,无法修改constant修饰的常量(string类型)
}
// 结构体类型(引用类型)
struct Person {
string name;
uint age;
}
// Person constant p1; // 出错, constant仅可以修饰值类型,无法修饰引用类型(string除外)
function f2() constant public {
m1 = 5; // constant修饰的函数内,如果修改了状态变量,那么状态变量的值是无法改变的!!
// 状态变量m1的值还是2,并未被修改。
}
2、view
只可以修饰函数,不可以修饰变量。
它表明该函数内部可以对storage类型的变量进行读取,无法修改。(类似constant修饰的函数)
3、pure
只能修饰函数。
它表明该函数内,无法读/写状态变量,否则编译通不过。
function f3() pure public returns(uint){
//return m1;
// 出错, pure修饰的函数内部无法修改也无法读取状态变量。
}
参考:https://blog.csdn.net/houyanhua1/article/details/88964166