函数及其类型
Tact 中的功能可以用不同的方式定义:
- 全局静态函数
- 扩展功能
- 可变函数
- 本地功能
- 接收器功能
- 获取器功能
除了 接收器函数,所有函数的定义(参数列表)和调用(参数列表)都可以使用逗号:
全局静态函数
您可以在程序的任何地方定义全局函数:
虚拟和抽象函数
如果 traits 有 virtual
关键字,则可以使用 override
允许继承 traits 的合约修改内部函数。 函数也可以标记为 抽象
,在这种情况下,继承合约必须定义其实现:
扩展功能
扩展函数允许你为任何可能的类型实现扩展。
警告 第一个参数的名称必须名为
self
,该参数的类型必须是你要扩展的类型。
可变函数
可变函数是对数值进行变异,用执行结果代替数值。 要执行突变,函数必须改变 self
值。
本地功能
本地函数是 FunC 函数的直接绑定:
注 本地函数也可以是可变函数和扩展函数。
Receiver functions
接收器函数是负责在合约中接收信息的特殊函数,只能在合约或特质中定义。
获取器函数
获取器函数定义智能合约上的获取器,只能在合约或特征中定义。
明确解决方法 ID 碰撞问题
Available since Tact 1.6与 TVM 合约中的其他函数一样,getters 也有其独特的相关函数选择器,即一些整数 ID(称为方法 ID)。
其中一些整数是为内部目的保留的,例如 -4, -3, -2, -1, 0 是保留 ID,而
常规函数(合约内部函数,不可从外部调用)通常由从 1 开始的后续(小)整数编号。
默认情况下,获取器有相关的方法 ID,这些 ID 是使用 CRC16 算法从名称中导出的,具体如下:
crc16(<function_name>) & 0xffff) | 0x10000
。
有时,这可能会使名称不同的获取器获得相同的方法 ID。
如果出现这种情况,您可以重命名合约中的某些获取器,或
以编译时表达式的形式手动指定获取器的方法 ID:
请注意,不能使用 TVM 保留的方法 ID,也不能使用某些初始正整数,因为编译器会将其用作函数选择器。
用户指定的方法 ID 是 19 位有符号整数,因此可以使用从 到 以及从 到 的整数。- 1$.
此外,还有一些方法 ID 是为 Tact 编译器在编译过程中插入的获取器保留的,它们是 113617、115390 和 121275。