希望这足以解决问题...
与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
编译时
虽然这似乎是一个可行的解决方案,但我怀疑还有一种更为优雅的编码方法。
{
let s = something;
&s
}
在Rust中几乎总是错误。引用总是从某物借来的,并且在该物销毁后,引用就不存在。局部变量在其作用域末尾销毁。所以这意味着:
制作
s
- 从
s
借用- 销毁
s
及其内容- 返回对已被销毁的东西的引用
{
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
),这就是为什么有两种类型的原因。