Можно ли использовать переменную в качестве аргумента заполнения в формате! макрос? - PullRequest
1 голос
/ 19 июня 2019

Я хотел имитировать функции Pythons rjust, ljust и center с помощью макроса format!, но мне удалось только найти решение, в котором можно передать строку и ширину.Если вы хотите передать аргумент заполнения, он не работает.

В документации сказано, что можно предоставить переменные для format!, а для аргумента width это работает просто отлично.Когда я пытаюсь использовать переменную для заливки, компилятор не распознает шаблон.

Работает только ширина как переменная:

fn rjust(text: &str, width: usize, fill: Option<char>) -> String {
    format!("{text:>width$}", text = text, width = width)
}
println!("{}", rjust("Hello", 10)); // "     Hello"

Предоставление заливки в качестве переменной не работает:

fn rjust(text: &str, width: usize, fill: char) -> String {
    format!(
        "{text:fill>width$}",
        text = text,
        fill = fill,
        width = width
    )
}
println!("{}", rjust("Hello", 20, '*'));

Сообщение об ошибке:

error: invalid format string: expected `'}'`, found `'>'`
 --> src/lib.rs:4:24
  |
4 |             "{text:fill>width$}",
  |              -         ^ expected `}` in format string
  |              |
  |              because of this opening brace
  |
  = note: if you intended to print `{`, you can escape it using `{{`

Если вместо переменной fill указать один символ, он будет работать нормально.Обратите внимание на символ *:

fn rjust(text: &str, width: usize, fill: char) -> String {
    format!("{text:*>width$}", text = text, width = width)
}
println!("{}", rjust("Hello", 20, '_')); // ***************Hello

Я ожидал, что версия с переменной заливкой будет работать так же, как и версия с жестким кодом *.

Обходной путь - вычесть длинутекст из ширины, а затем создайте String этой длины (fill-length) из символов заполнения и объедините их:

fn rjust(text: &str, width: usize, fill: char) -> String {
    let fill_len = width - text.len();
    let fill_str: String = (0..fill_len).map(|_| fill).collect();
    String::from(fill_str + text)
}
println!("{}", rjust("Hello", 20, '*')); // ***************Hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...