是否可以在format!宏中使用一个变量作为填充参数?

问题描述 投票:2回答:1

我想模仿Python的 rjust, ljustcenter 的函数,使用 format! 宏,但我只能找出一个可以传递字符串和宽度的解决方案。如果你想传入填充参数就不行了。

文档告诉我,可以向 format! 而对于宽度参数,它也能正常工作。当我尝试使用一个变量来填充时,编译器不识别这个模式。

只是把宽度作为变量就可以了。

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 `{{`

如果我提供一个单独的字符来代替填充变量,它就能正常工作。请注意 * 字符。

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
rust formatting fill
1个回答
1
投票

不幸的是,没有内置的方法可以做到这一点。

格式化语法是随着当时早期Rust采用者所需要的功能而发展的。它的复杂性意味着新的功能是 后话重提.

© www.soinside.com 2019 - 2024. All rights reserved.