在Rust中,我如何获取handlebars_helper!处理JSON对象

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

希望这足以解决问题...

与Rust一起使用车把,我试图实现一个处理程序来处理此输入:

 {{toJSON JSON_OBJ_OR_NONE}}

其中JSON_OBJ_OR_NONE是JSON的有效片段,例如

{
   "abc": 123,
   "def": ["g", "h", "i"],
   "jkl": {
     "m": 1,
     "n": "op"
   }
}

或一无所有(空字符串)。

应该返回的是提供的JSON的漂亮印刷版本,如果JSON_OBJ_OR_NONE为空,则返回“ {}”。

提供的JSON片段完全是任意的;它可以包含任何有效的JSON或空字符串。输出应打印精美。

我试图以多种不同的方式实现这一目标,目前我在

handlebars_helper!(toJSON: |json_obj_or_none: str|
if json_obj_or_none.is_empty() {
    "{}"
} else {
    let s = serde_json::to_string_pretty(&json_obj_or_none).is_ok().to_string();
    &s[..]
});

这看起来很近,但我看到了

error[E0597]: `s` does not live long enough
   --> src/main.rs:145:10
    |
145 |         &s[..]
    |         -^----
    |         ||
    |         |borrowed value does not live long enough
    |         borrow later used here
146 |     });
    |     - `s` dropped here while still borrowed

编译时

虽然这似乎是一个可行的解决方案,但我怀疑还有一种更为优雅的编码方法。

json rust handlebars.js
1个回答
0
投票
代码类似:

{ let s = something; &s }

在Rust中几乎总是错误。引用总是从某物借来的,并且在该物销毁后,引用就不存在。局部变量在其作用域末尾销毁。

所以这意味着:

    制作s
  1. s借用
  2. 销毁s及其内容
  3. 返回对已被销毁的东西的引用
  • 因此您需要传递所有权:

    { let s = something; s // not borrowed! }

    或通过将s移至示波器范围,确保不会很快破坏let

    let s; { s = something; &s // `s` isn't destroyed here, because `let s` was outside `{}` } // `s` and `&s` are destroyed now

    如果将它与if/else中的字符串文字混合使用,Rust会抱怨String&str不同。使用String::from("")作为文字,或查看包含两者的Cow类型。 Rust需要知道要释放的字符串(String),决不能释放的字符串(&str),这就是为什么有两种类型的原因。
  • © www.soinside.com 2019 - 2024. All rights reserved.