Appearance
常量
在 Tact 中,常量可能比其他流行语言中的常量更为高级:它们可以是虚拟的和抽象的。智能合约经常需要实现多个特性,有时你需要在编译时配置其中的一些特性。由于构造函数在特性中可能导致不可预测的行为,因此是禁止的。因此,我们必须使用常量和字段来传递值给它们。主合约的任务是为所有特性实现值和常量。
简单常量
首先,我们来定义一个简单的常量。这是一个在编译时定义且无法更改的值。你可以在顶级或在合约/特性内部定义常量。让我们在顶级定义一个常量:
solidity
const MY_CONSTANT: Int = 42;
特性和合约中的类似定义:
solidity
trait MyTrait {
const MY_CONSTANT: Int = 42;
}
contract MyContract {
const MY_CONSTANT: Int = 42;
}
虚拟和抽象常量
虚拟常量是可以在特性中定义但在合约中更改的常量。当你需要在编译时配置某些特性时,这非常有用。让我们定义一个虚拟常量和一个抽象常量:
solidity
trait MyTrait {
virtual const MY_FEE: Int = ton("1.0");
}
trait MyAbstractTrait {
abstract const MY_DEVFEE: Int;
}
现在你可以在合约中覆盖默认值:
solidity
contract MyContract with MyTrait, MyAbstractTrait {
override const MY_FEE: Int = ton("0.5");
override const MY_DEVFEE: Int = ton("1000");
}
这对于编译器在编译时有一些值非常有用,例如,你可以启用和禁用功能,而无需更改代码并且不浪费燃气。
solidity
trait Treasure {
virtual const ENABLE_TIMELOCK: Bool = true;
receive("Execute") {
if (self.ENABLE_TIMELOCK) {
//
// 如果 ENABLE_TIMELOCK 为 false,则此分支在编译时会被移除
//
}
}
}
contract MyContract with Treasure {
override const ENABLE_TIMELOCK: Bool = false;
}