Bootstrap

Rust “xxx“.to_string()和Rust String::from(“xxx“)区别(将字符串字面量(&str类型)转换为String类型)

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() 方法。

  • 它的调用方式是:你可以对任何实现了 ToStringDisplay 的类型调用 .to_string() 方法,返回一个 String

    示例

    let s = "hello".to_string(); // 这里调用的是 `&str` 类型的 `.to_string()` 方法
    
  • .to_string() 是通过调用 fmt::Display 来生成 String 的,因此它的表现力更强,能够用于将任何可以显示的类型(如数字、结构体等)转为字符串。

2. String::from()

  • String::from() 是直接通过构造器将一个 &str 转换为 String。它不会涉及 Display 或者格式化操作,直接执行从 &strString 的转换。

    示例

    let s = String::from("hello"); // 直接使用 `String::from()` 将 `&str` 转换为 `String`
    

区别总结:

  1. 实现方式

    • .to_string() 需要 Display trait,所以它可以用于任何实现了 Display trait 的类型。
    • String::from() 是专门用来将 &str 转换为 String,是一个直接的构造方法。
  2. 用途

    • .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 转换为 StringString::from() 是一个更直接、更简洁的选择。如果你需要从其他类型(比如数字类型)生成字符串,并且该类型实现了 Display,那么 .to_string() 会更加通用。

其他

注意:String::new()等价于String::from(""),都表示创建一个空字符串

;