【问题标题】:Built-in tester 'define' not working as I expected内置测试器“定义”没有像我预期的那样工作
【发布时间】:2019-11-18 15:41:15
【问题描述】:

我有一个模板,如果定义了变量,则该部分应呈现。但我不能让它工作。我的项目中有这样的东西:

use serde::Serialize;

#[derive(Default,Serialize)]
struct AStruct {
  parameter: Option<String>
}

// AStruct { parameter: None }
let a_struct_instance = AStruct {..Default::default()};
TEMPLATES.render("template.conf", &a_struct_instance) {...}
// template.conf example:
//
// {% if parameter is defined %}
//   SOMETHING TO SHOW
// {% endif %}

如果定义了参数,模板就会呈现,这是为什么呢?

参数字段为无,但在内置测试器函数中,'value' 为 Some(Null) 并且 is_some() 在此返回 true。

https://github.com/Keats/tera/blob/master/src/builtins/testers.rs#L36

/// Returns true if `value` is defined. Otherwise, returns false.
pub fn defined(value: Option<Value>, params: Vec<Value>) -> Result<bool> {
    number_args_allowed("defined", 0, params.len())?;
    Ok(value.is_some())
}

我做错了什么?

【问题讨论】:

  • defined 当前实现为value.is_some(),正如您所说,您的valueSome(Null),它是Some,因此它已定义,因此正确返回“true”
  • 是的,但我希望它是 None,我在“参数”字段中传递了一个带有 None 的结构。我忘了通过 serde 添加特征序列化,是必需的。我要更新这个问题。它可能与序列化/反序列化有关,将深入研究。

标签: rust tera


【解决方案1】:

好吧,我的问题是测试人员“已定义”或“未定义”检查变量是否已定义/未定义,而不是变量的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    相关资源
    最近更新 更多