我在Rust中看到了操作符r#""
,但我找不到它是做什么的。它在创建JSON时派上了用场:
let var1 = "test1";
let json = r#"{"type": "type1", "type2": var1}"#;
println!("{}", json) // => {"type2": "type1", "type2": var1}
运算符r#""
的名称是什么?如何让var1
求值?
发布于 2014-10-29 01:56:38
字符串字面量开头的r
字符表示。它不是一个操作符,而是一个前缀。
在普通的字符串文字中,需要对某些字符进行转义才能使它们成为字符串的一部分,例如"
和\
。需要对"
字符进行转义,因为否则它将终止字符串,并且需要对\
进行转义,因为它是转义字符。
在原始字符串文字中,您可以在r
和开始"
之间放置任意数量的#
符号。要关闭原始字符串文字,必须有一个结束的"
,后跟与开头相同数量的#
字符。使用零个或多个#
字符,您可以在字符串中放置文字\
字符(\
字符没有任何特殊含义)。对于一个或多个#
字符,您可以将文字"
字符放入字符串中。如果字符串中需要"
后跟一系列#
字符,那么只需使用相同数量的#
字符加1来分隔字符串即可。例如:r##"foo #"# bar"##
表示字符串foo #"# bar
。文字不会在中间的引号处停止,因为它后面只有一个#
,而文字是以两个#
开始的。
要回答问题的最后一部分,不可能有一个字符串文字来计算当前作用域中的变量。一些语言,如PHP,支持它,但不支持Rust。您应该考虑改用format!
宏。请注意,对于JSON,即使是在原始字符串文字中,您仍然需要双括号,因为该字符串是由宏来解释的。
fn main() {
let var1 = "test1";
let json = format!(r#"{{"type": "type1", "type2": {}}}"#, var1);
println!("{}", json) // => {"type2": "type1", "type2": test1}
}
如果你需要生成大量的JSON,there are many crates that will make it easier for you。特别是,使用serde_json
,您可以定义常规的Rust结构或枚举,并将它们自动序列化为JSON。
发布于 2019-08-25 15:56:53
我第一次看到这种奇怪的符号是在glium tutorials (旧的图形管理板条箱)中,它被用来“封装”GLSL代码(GL着色语言)并将其传递给GPU的着色器
https://github.com/glium/glium/blob/master/book/tuto-02-triangle.md
据我所知,r#...#的内容看起来是原封不动的,它没有以任何方式解释。因此,原始字符串。
https://stackoverflow.com/questions/26611664
复制相似问题