gpt4 book ai didi

freemarker - 在 Freemarker 宏中模拟空参数

转载 作者:行者123 更新时间:2023-12-04 00:05:33 25 4
gpt4 key购买 nike

我正在使用 Freemarker 构建一个站点,并且已经开始大量使用宏。我知道在 Freemarker 2.3 中,将空值作为参数传递给宏相当于根本不传递参数,因此我创建了一个名为“null”的全局变量来模拟宏中的空检查:

<#assign null="NUL" />

现在在我的宏中,我可以这样做:
<#maco doSomething param1=null>
<#if param1 != null>
<div>WIN!</div>
</#if>
</#macro>

如果我想传递一个不是标量的参数,就会出现问题。例如,将列表(在 Freemarker 中是 SimpleSequence)传递给宏并检查我的 null 关键字会产生错误:

freemarker.template.TemplateException: The only legal comparisons are between two numbers, two strings, or two dates. Left hand operand is a freemarker.template.SimpleSequence Right hand operand is a freemarker.template.SimpleScalar



我查看了 freemarker 代码,我可以看到问题(ComparisonExpression.isTrue()):
if(ltm instanceof TemplateNumberModel && rtm instanceof TemplateNumberModel) { 
...
}
else if(ltm instanceof TemplateDateModel && rtm instanceof TemplateDateModel) {
...
}
else if(ltm instanceof TemplateScalarModel && rtm instanceof TemplateScalarModel) {
...
}
else if(ltm instanceof TemplateBooleanModel && rtm instanceof TemplateBooleanModel) {
...
}
// Here we handle compatibility issues
else if(env.isClassicCompatible()) {
...
}
else {
throw new TemplateException("The only legal comparisons...", env);
}

所以我能想到的唯一解决方案是将 isClassicCompatible 设置为 true,我认为这将在两个对象上调用 toString() 并比较结果。但是,文档特别指出任何依赖于旧功能的东西都应该重写。

我的问题是,是否有不依赖已弃用功能的解决方案?

最佳答案

null引用是 FreeMarker 中的设计错误。由于您提到的原因,定义自定义空值(它是一个字符串)并不是一个好主意。应改用以下结构:

  • 宏和函数参数可以有默认值,因此调用者可以省略它们
  • 检查变量是否为 null ,您应该使用 ??运营商:<#if (name??)>
  • 当你使用一个可以是 null 的变量时,您应该使用 !运算符指定默认值:name!"No name"
  • 要检查序列(或字符串)是否为空,请使用 ?has_content内置:<#if (names?has_content)>

  • 您可以在宏中指定一个空序列作为默认参数值,并简单地测试它是否为空。

    关于freemarker - 在 Freemarker 宏中模拟空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553004/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com