跳转到内容

常数

Tact 中的常量可以比流行语言中的常量更先进一些:它们可以是虚拟的、抽象的。 智能合约通常需要实现多个特征,有时您需要在编译时配置其中的一些特征。 禁止使用特质中的构造函数,因为它们的行为是无法预测的。 因此,我们必须使用常量和字段来传递值。 主合同的职责是为所有特性实现值和常量。

简单常数

让我们从一个简单的常数开始。 这是一个在编译时定义的值,不能更改。 您可以在顶层或合约/特质中定义常量。 让我们在顶层定义一个常量:

const MY_CONSTANT: Int = 42

特征和合同也类似:

trait MyTrait {
const MY_CONSTANT: Int = 42;
}
contract MyContract {
const MY_CONSTANT: Int = 42;
}

虚拟常量和抽象常量

虚拟常量是可以在特质中定义但在合约中改变的常量。 当您需要在编译时配置某些特征时,它非常有用。 让我们定义一个虚拟常量和一个抽象常量:

trait MyTrait {
virtual const MY_FEE: Int = ton("1.0");
}
trait MyAbstractTrait {
abstract const MY_DEVFEE: Int;
}

现在,您可以覆盖合同中的默认设置:

contract MyContract with MyTrait, MyAbstractTrait {
override const MY_FEE: Int = ton("0.5");
override const MY_DEVFEE: Int = ton("1000");
}

这对于帮助编译器在编译时获得某些值可能非常有用,例如,您可以启用或禁用功能,而无需修改代码,也不会浪费 gas 。

trait Treasure {
virtual const ENABLE_TIMELOCK: Bool = true;
receive("Execute") {
if (self.ENABLE_TIMELOCK) {
//
// This branch would be removed in compile time if ENABLE_TIMELOCK is false
//
}
}
}
contract MyContract with Treasure {
override const ENABLE_TIMELOCK: Bool = false;
}