铃心自定义——C11:词集规范

词集是一个非常简便和有效的方式——对于添加一个简单的随取类功能来说。但是在逐步的发展中,词集逐渐变得愈发强大乃至将会取代一系列功能的使用。

编写于2020.11.15 转载请注明原作者

“词集”的演化

“词集”是什么

传统意义上来看,词集其实就是对于一个大文本的【随取】

最最传统的词集其如下:

但是随着词集内容的增加,使用随取将会变得逐渐困难
而<入门形式>的词集,使用起来问题更是漏洞百出——因为其不能嵌套在常规的回复之中(但是如果你用【回复】调用也不是不可以)

总而言之,词集就是对于一个大量文本随机取出一个进行回复的机制。其名称也说明了一切。
词集,即是一个词语的集合,我们要使用的不过是其中的几个词语罢了。

较传统的词集函数

在长期的使用中,词集发生了一点常规范围内的演化

我们有一个非常常规的词集文件,其内容是包含一些甜品的随取

ANSI编码词集

那么常规来看,我们调用这个文件,所进行的操作只有【取出一行】

可以看到,这样封装之后,我们调用【词集】函数就可以一定程度上的简化整体代码的复杂度,可以说是相当方便了。

但是这就完美了吗?不,问题还有很多,其主要问题我罗列在下面。

  1. 词集不支持铃心变量
  2. 调用时需要输入路径,较麻烦
  3. 调用的时候会反复读取文件,对于大的词集文件来说,反复读取的速度会很慢很慢
  4. 词集本身逻辑过于简单,并不能达到像牌堆一样的堆叠结构

针对上述问题,我们会逐个进行解决。

词集函数的发展

在第一个改进版本中,它兼容了铃心变量,改善了输入方式,并且解决了反复读取文件的问题,但是仍旧存在有很严重的读取问题。

在这里,我们解决了上述提到的四个问题,在一定程度上让词集真真正正的拥有了一定程度的便利性和实用性,只需要调用一个小函数,就可以迅速有效的返还一个较为合理的结果。

但随着词集的进一步大规模应用,更多的问题浮出了水面

  1. 词集数量过多时初始化速度过慢
  2. 无法对于存储词集的文件夹进行有效的结构管理
  3. 词集并不支持过于复杂的内在逻辑

新的想法的提出

在一开始的设计中,词集采用的跟牌堆相似的方案——即是在初始化程序中便一次性读取所有的词集到内存中。
这样做的好处是后续调用速度非常的迅速,且没有什么额外的限制。
但是对于铃心来说,用户很有可能需要经常保存来进行调试。而每次保存都会重新运行一次[初始化词集]。招致的大量卡顿对于一般用户来说可能让他们苦不堪言。

为此,“动态加载”的方法浮出了水面。

那么,何为“动态加载”

答:在我们用的时候才加载,就是所谓的“动态加载”。通过把一次性读入的分批次、按照需求读取,极大的提高了内存空间的利用率,降低了初始化的卡顿,并且也完美的实现了我们一开始的目的。

词集函数&牌堆

动态加载词集的实现

由于在此期间还有过几次词集函数的变更,而我并没有保存,所以很难向你们阐述其间的思路变化,只能够向你们解释最后词集实现的结果。

既然是基于动态加载,因此初始化部分并不会读入所有的词集内容。但是为了加速后续检索过程,在初始化过程中仍就会读取一点点东西——那就是词集文件夹下所有文件的名称和对应的子路径。

这样,我们就获取了一个所有词集文件的路径,我们在需要对应词集的时候,就在这个常量之中进行一次检索,取出对应的路径而后读入即可

在之前的版本中,每次读取新词集,会对这个目录进行一次搜索,这样的搜索单次发生不会影响到太多的速度,但是一旦有多个词集都需要进行初始赋值的话,那样首次赋值的速度会因为文件搜索而变得很慢。(其实还好)

这样我们就完美的解决了上述提到的所有问题。(除了复杂的内在逻辑实现)。

如何使用词集

现有的词集机制是如此的“完美”,以至于我们能够做到很多以前想都不敢想的事情

一般来说,词集会存放在一个固定的词集目录中,也就是上述声明的【常量路径】\词集,当然也可以自行更改。
出于教学目的,我创建了一个新的文件作为展示用,名为<测试词集>。如果你复制上面的代码,那请把<测试词集>改为<词集>。

此为【常量路径】\测试词集

我们以一个结构完善的“abo”作为一个样例,在<测试词集>文件夹下面新建一个文件,名为<abo>,在其中加入两个子类别文件,分别为<abo-性别>和<abo-味道>

如图所示

在其中按照常规词集写法,写入词集内容。

然后新建一个<abo>文件,在<abo>中,用【词集】函数调用其他词集。

可以使用铃心变量

在做完如此操作之后,修改编码为ANSI,然后重新保存bot,刷新【常量文件路径列表】,而后使用#abo调用,即可看到结果。

【词集】函数支持跨文件调用,这意味着它非常的灵活自由和简便。
但同时也要注意,尽量降低词集文件命名的重复性,防止出现预料之外的bug。

词集的进一步延伸

截止到目前,已经兼容了非重词集,非重重置,权重词集的制作,但在此我只会放出目前版本自我使用的函数,而不去进行讲解。

结语

词集表面简单,但实际上也蕴含着无数的道理。在不断地改进过程中,词集本身被赋予了极大的扩展性和适用性。
熟练地使用词集,将会极大的简化你已有的铃心代码结构,让你的回复变得更加的简洁与完善

愿下次与你相会

Yorunina

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐