我对小胡子很陌生,但我的基本谷歌搜索似乎没有发现任何东西。我正在尝试编写一个模板,用于在 Typescript 中编码未知数量的字段。基本上它看起来像:
encode(writer: _m0.Writer = _m0.Writer.create()) {
writer.uint32(10).string(xx)
writer.uint32(18).string(xx)
writer.uint32(26).string(xx)
...
etc
我需要每次将
uint32(xx)
中的值增加8。到目前为止,对于我的模板,我有
encode(writer: _m0.Writer = _m0.Writer.create()) {
{{#fields}}
writer.uint32().string({field}}
{{/fields}}
}
有没有可能做我想做的事?
可以做到,如果您接受某些逻辑需要在 TypeScript 中完成。
开始之前:你需要用双胡子分隔所有标签。你不应该写
.string({field}}
,而是.string({{field}}}
.
由于您要在
.uint32()
的括号之间插入一个值,因此只有一个标签可以完成这项工作:变量标签。我给它起个名字counter
:
.uint32({{counter}})
因此,无论如何,您的完整模板将如下所示:
encode(writer: _m0.Writer = _m0.Writer.create()) {
{{#fields}}
writer.uint32({{counter}}).string({{field}}}
{{/fields}}
}
现在的问题仍然是如何确保
counter
存在并在 {{#fields}}...{{/fields}}
的每次迭代中取正确的值。最直接的方法是准备您输入模板的数据,以便每个 field
都有对应的 counter
具有正确的值:
{
fields: [{
field: 'ab',
counter: 10,
}, {
field: 'cd',
counter: 18,
}, {
field: 'ef',
counter: 26,
}],
}
但是,您可能正在寻找一种自动计算数字的方法。在这种情况下,lambdas 会支持您(单击该链接后需要向下滚动一点)。对于一个非常通用的解决方案,首先编写一个函数,该函数生成在每次调用时返回系列中的下一个数字的函数:
function iterate(initialValue, increment) {
let value = initialValue;
return function() {
const oldValue = value;
value += increment;
return oldValue;
};
}
现在,您可以在传递给模板的数据中设置像
counter
这样的功能:
{
fields: [{
field: 'ab',
}, {
field: 'cd',
}, {
field: 'ef',
}],
counter: iterate(10, 8),
}
使用任何一种方法,结果都是:
encode(writer: _m0.Writer = _m0.Writer.create()) {
writer.uint32(10).string(ab}
writer.uint32(18).string(cd}
writer.uint32(26).string(ef}
}
您可以在 Wontache playground 通过将以下代码粘贴到其加载/存储框中进行尝试。
{"data":{"text":"{\n fields: [{\n field: 'ab',\n }, {\n field: 'cd',\n }, {\n field: 'ef',\n }],\n counter: (function(initialValue, increment) {\n let value = initialValue;\n return function() {\n const oldValue = value;\n value += increment;\n return oldValue;\n };\n }(10, 8)),\n}"},"templates":[{"name":"encoding","text":"encode(writer: _m0.Writer = _m0.Writer.create()) {\n {{#fields}}\n writer.uint32({{counter}}).string({{field}}}\n {{/fields}}\n}"}]}