在Rust中使用字符串文字更方便的连接

Art*_*mGr 10 rust

在每晚的Rust中,不再可能将字符串文字指定为带有"〜"字符的 String .

例如,在C++中,我使用用户定义的文字连接字符串文字,而不是std::string每次都提到的外壳:

inline std::string operator"" _s (const char* str, size_t size) {return std::string (str, size);}
foo ("Hello, "_s + "world!");
Run Code Online (Sandbox Code Playgroud)

在Rust中是否存在类似的功能,以使字符串文字连接不那么痛苦String::from_str ("Hello, ") + "world!"

huo*_*uon 21

注意:这个答案与Rust的1.0之前版本有关,并且自编写以来库已经发生了变化.事实上,concat!已经消失了,取而代之的\是.以前操作员被迫将\其作为其参数,意味着现在突变或分配重用,但现在它需要按值(即&str没有引用)意味着它可以重用分配.

如果你真的(哈)有字符串文字,你可以使用String宏,例如push_str.您也可以在几行中原生地拆分字符串,例如

let lit = concat!("Hello, ", "world!")
Run Code Online (Sandbox Code Playgroud)

(SliceConcatExt::concat消耗所有后面的空格,包括下一行的前导空格;省略concat!将包括字符串数据"逐字",带换行符和前导空格等.)

在任何情况下,\\在这样的情况下是非常低效的,因为&str会丢弃旧的分配,并创建一个新的使用结果(即它不会重复使用旧的内存).如果你不只是处理文字,并逐步构建一个字符串,你可以使用String链式push_strSliceConcatExt::concat迭代,`let mut s ="foo".to_string(); s.push_str( "条"); s.push_str( "巴兹");.


bar*_*jak 13

你可以使用format!宏.它更具可读性,更易于翻译,更高效,更强大(您可以连接不仅仅是字符串,就像C++一样ostringstream).它也是完全类型安全的.

format!("Hello, {}", "world!")
Run Code Online (Sandbox Code Playgroud)

您还可以使用命名参数来提高可读性.

format!("hello, {who}", who = "world")
Run Code Online (Sandbox Code Playgroud)

完整的格式化语法在std :: fmt中描述.

Rust没有用户定义的文字.我认为添加这样的功能是向后兼容的,所以也许这个功能将在Rust 1.0之后添加.