enum Status{ Vacant, Occupied }
Status currentStatus;
event Occupy(address _occupant, uint _value);
问问题
149 次
1 回答
0
与其他一些编程语言一样,enum
( docs ) 允许您将多个值聚合为一种数据类型,其中只有一个值处于活动状态。
在您的情况下,currentStatus
可以是Vacant
(整数值 0),也可以是Occupied
(整数值 1)。但永远不能是“这些都不是”,也不是“两者”,也不是“其他任何东西”。
pragma solidity ^0.8;
contract MyContract {
enum Status {
Vacant,
Occupied
}
Status currentStatus;
// you can effectively pass `0` or `1` integer value here
function setCurrentStatus(Status _currentStatus) external {
currentStatus = _currentStatus;
}
function getCurrentStatusVerbose() external view returns (string memory) {
if (currentStatus == Status.Vacant) {
return "The current status is Vacant";
} else if (currentStatus == Status.Occupied) {
return "The current status is Occupied";
}
}
}
事件 ( docs ) 可以被链下应用程序读取,而不能被其他合约读取。通常,链下应用程序会监听这些发出的事件以在其端执行操作。
pragma solidity ^0.8;
contract MyContract {
event Occupy(address _occupant, uint _value);
enum Status {
Vacant,
Occupied
}
Status currentStatus;
function setCurrentStatus(Status _currentStatus) external {
currentStatus = _currentStatus;
// emitting the `Occupy` event
emit Occupy(msg.sender, uint(_currentStatus));
}
}
链下应用:
myContract.on('Occupy', async (event) => {
updateOccupancyInExternalDB(event);
});
一个真实的例子是Transfer()
定义ERC-20 代币标准的事件。当代币合约发出此事件时,表示发生了代币转移。区块链浏览器(例如 Etherscan)监听这些事件并更新他们自己数据库中的代币余额信息(从发送者余额中减去并增加他们自己数据库中的接收者余额)。
于 2021-12-06T10:30:38.320 回答