为什么用彩色箱子中的彩色字符串替换子字符串不起作用?

时间:2018-10-13 12:35:05

标签: string rust

我正在尝试将所有出现的给定字符串替换为彩色版本:

extern crate colored; // 1.6.1

use colored::Colorize;

fn print_found_line(x: &i32, line: &String, found: &str) {
    let mut line_to_print: String = line.clone();

    println!("{}", found.red()); // work
    line_to_print = line_to_print.replace(found, found.red().as_ref());
    println!("[{}] {}", x.to_string().blue(), line_to_print); // the found string replaced is not red
}

fn main() {}

第一个println!可以正常工作并以红色打印文本,但是第二个println!不能正常工作并以默认颜色打印文本。

似乎字符串文字会丢失颜色信息。我想找到一个replace等效项,可以根据需要打印文本。

1 个答案:

答案 0 :(得分:1)

ColoredString实现Deref<Target = str>,但返回的&str不包含任何颜色信息。您可以通过打印出取消引用的字符串来查看此内容:

println!("{}", found.red().as_ref() as &str);

看来正确的做法是将彩色文本转换为String,然后将其用于格式设置。

另外:

  • 采取&String是没有用的。
  • 在替换String之前将其克隆是没有用的
fn print_found_line(x: &i32, line: &str, found: &str) {
    let line_to_print = line.replace(found, &found.red().to_string());
    println!("[{}] {}", x.to_string().blue(), line_to_print);
}

另请参阅: