使用小胡子模板创建编码函数

问题描述 投票:0回答:1

我对小胡子很陌生,但我的基本谷歌搜索似乎没有发现任何东西。我正在尝试编写一个模板,用于在 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 mustache
1个回答
0
投票

可以做到,如果您接受某些逻辑需要在 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}"}]}
© www.soinside.com 2019 - 2024. All rights reserved.