Skip to content

常量

在 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;
}