本文介绍了Solidity中的存储变量,并通过代码示例详细解释了存储变量的声明、使用以及不同修饰符(如pure
、view
、public
和internal
)的区别。文章还强调了存储变量的持久性和其对区块链状态的影响。
到目前为止,我们所有的函数都只是返回纯粹依赖于函数参数的值。它们不依赖于除立即输入之外的任何内容。这就是为什么它们被称为纯函数。它们不知道区块链的状态或过去发生的任何事情。
如果我们要跟踪某些内容,比如某人欠了多少钱,或者他们在游戏中有多少分数,这将会非常成问题。
现在我们介绍存储变量。
这些变量看起来像其他语言中的“类变量”,但行为并不像它们。你可以将它们视为行为类似于微型数据库的变量。
让我们看一个例子
contract ExampleContract {
uint256 internal x;
function setX(
uint256 newValue
)
public {
x = newValue;
}
function getX()
public
view
returns (uint256) {
return x;
}
}
我们有很多东西要解释!
在函数外声明的变量是存储变量。它们在交易结束后仍然保留其值。
注意getX()
有修饰符view
,而不是pure
。这是因为它会查看区块链的状态,即存储在变量x
中的内容。如果你在这个例子中将view
改为pure
,代码将无法编译。你也可以将view视为只读。还要注意getX
的返回值与x
的类型相同,都是uint256
。
其次,请注意setX
没有view
或pure
修饰符。这是因为它是一个状态改变函数。改变存储变量或对区块链进行其他持久性更改的函数不能有view
或pure
修饰符,因为它们不是只读的,因此不能被标记为view
,当然也不能标记为pure
。
为了强调这一点,请注意以下代码是无效的
contract ExampleContract {
uint256 internal x;
function setX(
uint256 newValue
)
public {
x = newValue;
}
// error: this function cannot be pure
function getX()
public
pure
returns (uint256) {
return x;
}
}
请注意,变量x
本身有修饰符internal
。这意味着其他智能合约无法看到这个值。
变量是internal
的并不意味着它是隐藏的。它仍然存储在区块链上,任何人都可以通过解析区块链来获取该值!
这才是事情变得令人困惑的地方。
以下代码也是有效的,但它被认为是不好的做法。
contract ExampleContract {
uint256 x;
function setX(
uint256 newValue
)
public {
x = newValue;
}
function getX()
public
view
returns (uint256) {
return x;
}
}
在这种情况下,我们去掉了x
的internal
修饰符,它仍然可以编译。这被认为是不好的做法,因为你没有明确表达X
的可见性意图。
以下代码也是有效的
contract ExampleContract {
uint256 public x;
function setX(
uint256 newValue
)
public {
x = newValue;
}
function getX()
public
view
returns (uint256) {
return x;
}
}
当变量被声明为public
时,意味着其他智能合约可以读取该值但不能修改它。
这很令人困惑,因为public
函数可以修改变量,但public
变量不能被修改,除非有一个函数来改变它们的值。
总结
存储变量在函数外声明
没有view
或pure
修饰符的public函数可以改变存储变量
纯函数不能访问存储变量
练习题目
请查看 Web3 区块链培训营,了解更多关于智能合约开发和代币标准的信息。
- 原文链接: rareskills.io/learn-soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!