自定义泛型节点
自定义泛型节点
本文档假设您已经了解泛型节点的基本知识。如果对此概念尚未了解,请先阅读文档进阶话题-泛型与变参。
泛型端口
创建一个泛型节点的过程跟创建一个普通节点非常类似,只不过是在放置输入端口时需要防止如下类型的泛型端口:
ticos/flow-nodes/input-t1
ticos/flow-nodes/input-t2
ticos/flow-nodes/input-t3
ticos/flow-nodes/output-t1
ticos/flow-nodes/output-t2
ticos/flow-nodes/output-t3
这些泛型端口也可以和普通端口混合使用。
构建一个自定义泛型节点的常规方法是基于其他的现有泛型节点,比如可以基于 if-else
这个泛型节点来构建一个自己的泛型节点:
标记为抽象节点
如果一个泛型节点不能直接被使用,我们就需要将其标记为抽象(Abstract)节点。
方法很简单,在这个泛型节点中放置一个 ticos/flow-nodes/abstract
即可。
在标记为抽象节点后,系统将会在编译时强制性的寻找该泛型节点的特化(Specialization)版本。没有找到对应的泛化节点会导致系统报错。
特化节点
我们可以为每一个泛型节点提供多个特化节点。系统在编译时如果发现有泛型节点就会启动特化节点的查找过程,如果找到就会进行实时替换。
特化节点跟常规节点没有本质性不同,除了如下一些细节:
名称通常为这种格式
<basename>(<t1>, <t2>, <t3>)
,比如gate(number)
表示是gate
这个泛型节点针对number
类型的特化节点;名称为
<basename>
,用以表示是某个泛型节点针对同一个库里某特定类型的特化版本,比如ticos-dev/w5500/open-tcp
是泛型节点ticos/net/open-tcp
针对类型ticos-dev/w5500/w5500-inet
的特化节点;
由上也可以总结出,特化节点和对应的泛型节点并不一定要在同一个节点库中。因此我们可以为其他人的泛型节点用特化的方式添砖加瓦。
泛型规则
为了让系统可以正确的推导泛型节点中的类型,我们需要遵循一些基本规则:
如果节点的输出端口包含泛型,那么输入端口必须包含一个对应的泛型类型。比如输出端口如果使用了
output-t2
,那么输入端口必须包含input-t2
;对于某个泛型节点不能存在该泛型节点针对某一特定类型的多个特化节点。因为这会导致系统的类型推导失败。如果因为各种原因已经存在多个特化版本,那么开发者只能手动指定某个特化节点;
泛型已经成为几乎所有主流编程语言的必备能力。同样在 Ticos Studio 中,熟练和灵活的使用泛型节点可以达到事半功倍的效果。