如何直接创建String?

ima*_*ahi 10 rust

.to_string()当我需要一个字符串时,有什么方法可以避免调用吗?例如:

fn func1(aaa: String) -> ....
Run Code Online (Sandbox Code Playgroud)

而不是

func1("fdsfdsfd".to_string())
Run Code Online (Sandbox Code Playgroud)

我可以这样做:

func1(s"fdsfdsfd")
Run Code Online (Sandbox Code Playgroud)

Geo*_*ard 12

不,该str::to_string()方法是String&'static str(字符串文字)创建a的规范方法.我甚至喜欢它,因为你不喜欢它:它有点冗长.因为它涉及堆分配,所以在调用它们之前应该三思而后行.另请注意,由于Rust获得了impl专业化,str::to_string因此不会慢于str::to_owned或类似.

但是,你真正想要的是一个func1可以很容易地传递任何字符串,无论是a &str还是a String.因为StringDEREF&str,你可以func1接受的&str,从而完全避免了串分配.看这个例子(playground):

fn func1(s: &str) {
    println!("{}", s);
}

fn main() {
   let allocated_string: String = "owned string".to_string();
   func1("static string");
   func1(&allocated_string);
}
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下仍然使用`to_string`,即使它在技术上有点慢.但是,通过专业化,它将不会. (2认同)
  • `to_string`绝对是**惯用的**选择 - 它目前还不是高性能的选择.大约六个月前,我发表评论(https://github.com/rust-lang/rust/pull/19708#issuecomment-66930515),替换`to_string`使得我的代码占了前一段时间的87%. (2认同)
  • 三十三,因为这是将借来的价值变成一个拥有的价值的通用方式. (2认同)

She*_*ter 11

TL; DR:

由于锈1.9,str::to_string,str::to_owned,String::from,str::into都具有相同的性能特点.使用您喜欢的任何一种.


将字符串slice(&str)转换为拥有的字符串(String)的最明显和惯用的方法是使用ToString::to_string.这适用于任何实现的类型Display.这包括字符串切片,还包括整数,IP地址,路径,错误等.

在Rust 1.9之前,str实现了to_string利用格式化基础结构.虽然它有效,但它是过度杀伤而不是最高效的路径.

使用较轻的解决方案ToOwned::to_owned,该解决方案适用于具有"借用"和"拥有"对的类型.它以有效的方式实施.

另一个轻量级解决方案是使用Into::into哪种杠杆From::from.这也有效地实施.


对于你的具体情况,最好的办法是接受一个&str,因为三十三个人回答.然后你需要做零分配,这是最好的结果.

一般情况下,我可能会使用,into如果我需要创建一个分配的字符串 - 它只有4个字母长^ _ ^.在回答有关Stack Overflow的问题时,我会使用to_owned它,因为它更加明显地发生了什么.


rof*_*rol 6

dtolnay

\n
\n

我现在强烈喜欢to_owned()字符串文字而不是to_string()or into()

\n

String和 和有什么区别&str?一个不令人满意的答案是 \xe2\x80\x9cone 是一个字符串,另一个不是字符串\xe2\x80\x9d,因为显然两者都是字符串。使用字符串并将其转换为字符串to_string()似乎忽略了我们首先这样做的原因,更重要的是错过了向读者记录这一点的机会。

\n

String 和 &str 的区别在于,一种是拥有的,一种是不拥有的。使用to_owned()完全捕获了代码中特定位置需要转换的原因。

\n
struct Wrapper {\n    s: String\n}\n   \n// I have a string and I need a string. Why am I doing this again?\nWrapper { s: "s".to_string() }\n   \n// I have a borrowed string but I need it to be owned.\nWrapper { s: "s".to_owned() }\n
Run Code Online (Sandbox Code Playgroud)\n
\n

维塔利德

\n
\n

如果你在心里读到to_string的话就不会to_String

\n
\n