为什么 String 可以调用 Colorize 特征方法,而 String 却没有实现 Colorize

Iza*_*ana 2 rust

来自ColorizeTrait docString并没有实现它(而 &str 实现了它)。

fn blue(self) -> ColoredString
where
    Self: Sized, 
Run Code Online (Sandbox Code Playgroud)

但为什么String类型可以调用它的方法呢?

use colored::Colorize;

fn main() {
    let blue = "blue".to_owned().blue();
    println!("{}", blue);
}

Run Code Online (Sandbox Code Playgroud)

编辑

  • [未解决]怎样才能脱糖呢?(具体来说,要弄清楚是否发生了自动取消引用)

  • 幕后发生了什么?

对方法调用进行类型强制。String可以被&str强迫&*String

Rit*_*hra 6

该特征Colorize是为 实现的&'a str,并String实现Deref<Target=str>

Rust 方法调用规则意味着该值可能会自动被借用或取消引用。

这意味着对于我们的方法调用String,Rust 将寻找具有以下类型之一作为接收器类型的方法

  • String
  • &String
  • &mut String
  • str(由德雷夫)
  • &str(这个让方法调用起作用)
  • &mut str

由于String只是借用,打电话后即可使用.blue()

use colored::Colorize;

fn main() {
    let x = "hello".to_string();
    let y = x.blue();

    println!("{}", x);
    println!("{}", y);
}
Run Code Online (Sandbox Code Playgroud)

关于如何解析方法调用的 Rust 参考链接

  • `x` 没有被移动,因为 `self` 是 `&amp;str`,而共享引用是 `Copy`。 (3认同)