Почему замена подстроки цветной строкой из цветного ящика не работает? - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь заменить все вхождения данной строки на раскрашенную версию:

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 голосов
/ 13 октября 2018

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);
}

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...