文章目录
Rust “xxx”.to_string()和Rust String::from(“xxx”)区别
.to_string()
和 String::from()
都可以用于将字符串字面量(&str
类型)转换为 String
类型,但是它们在内部实现和用途上略有不同。下面是它们的区别:
1. .to_string()
(能够将任何可以显示的类型(如数字、结构体等)转为字符串)
-
.to_string()
是ToString
trait 的一个方法。ToString
trait 是Display
trait 的副作用,所以任何实现了Display
trait 的类型都可以使用.to_string()
方法。 -
它的调用方式是:你可以对任何实现了
ToString
或Display
的类型调用.to_string()
方法,返回一个String
。示例:
let s = "hello".to_string(); // 这里调用的是 `&str` 类型的 `.to_string()` 方法
-
.to_string()
是通过调用fmt::Display
来生成String
的,因此它的表现力更强,能够用于将任何可以显示的类型(如数字、结构体等)转为字符串。
2. String::from()
-
String::from()
是直接通过构造器将一个&str
转换为String
。它不会涉及Display
或者格式化操作,直接执行从&str
到String
的转换。示例:
let s = String::from("hello"); // 直接使用 `String::from()` 将 `&str` 转换为 `String`
区别总结:
-
实现方式:
.to_string()
需要Display
trait,所以它可以用于任何实现了Display
trait 的类型。String::from()
是专门用来将&str
转换为String
,是一个直接的构造方法。
-
用途:
.to_string()
可以用于任何可以展示(Display
)的类型,比如数字、结构体、字符串字面量等。String::from()
主要用于将&str
转换为String
,它是一个更直接的方式。
性能:
- 在性能上,二者的差异非常小,通常不会有显著的差别,因为它们的底层实现都很相似。
String::from()
可能稍微高效一点,因为它不涉及额外的格式化步骤,而.to_string()
会通过Display
trait 的格式化来生成String
,但是这种差异在大多数应用场景下是微乎其微的。
示例对比:
#![allow(dead_code)] // 忽略全局dead code,放在模块开头!
#![allow(unused_variables)] // 忽略未使用变量,放在模块开头!
// #[derive(Debug)]
fn main() {
let s1: String = "hello".to_string(); // 使用 `.to_string()`
let s2: String = String::from("hello"); // 使用 `String::from()`
println!("{}", s1);
println!("{}", s2);
}
这两个方法效果是一样的,都会将 "hello"
转换为 String
类型。
总的来说,如果你只是需要将 &str
转换为 String
,String::from()
是一个更直接、更简洁的选择。如果你需要从其他类型(比如数字类型)生成字符串,并且该类型实现了 Display
,那么 .to_string()
会更加通用。