1

我正在尝试将 lambda 表达式与 Rythm Engine 一起使用,并且它在大多数情况下都有效。但是,当我在 lambda 表达式中调用标记时,它不起作用。

最简单的例子:

@test(x -> blabla(x) )

@def test(java.util.function.Function f) {
    @f.apply("Test")
}

@def blabla(String text) {
    ...
    Test: @text
    ...
}

如果我在 lambda 表达式中使用字符串连接,它可以完美地工作,但在我的真实代码中我需要调用一个复杂的标记。

有人知道我该怎么做吗?

谢谢你。

4

1 回答 1

1

最后,我找到了解决方案。

修改生成的java代码,可以看到名为“blabla”(对不起,愚蠢的名字)的函数有签名:

public org.rythmengine.utils.RawData blabla(String text)

因此,使其工作的方法是调用“RawData.toString()”。

解决方案是:

@test(x -> blabla( x.toString() )

@def test(java.util.function.Function<String, String> f) {
    @f.apply("Test")
}

@def blabla(String text) {
    ...
    Test: @text
    ...
}

为了防止不必要的强制转换,我将参数“String, String”添加到泛型类“java.util.function.Function”中。

要测试代码,定义环境变量“home.tmp.dir”并使用原始代码类型很有用:

Map<String, Object> conf = new HashMap<>();
conf.put("home.tmp.dir", "./rythm/"); // Generated code

RythmEngine engine = new RythmEngine(conf);
engine.prepare(ICodeType.DefImpl.RAW);
于 2018-04-23T17:34:28.593 回答