Я хотел имитировать функции 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