我想使用println!强大的格式化工具format!来打印特定次数的字符.当然这可以通过循环来实现,如下所示:
fn give_love(count: usize) {
print!("Here is love for you: ");
for i in 0..count {
print!("?");
}
println!("");
}
Run Code Online (Sandbox Code Playgroud)
但我既不想写循环也不想写三个print.如何更短/更好?
fn give_love(count: usize) {
println!("Here is love for you: {:?<1$}", "", count);
}
Run Code Online (Sandbox Code Playgroud)
您可以(错误地)使用填充功能,该功能允许使用您选择的某些字符填充打印值.仅此功能的语法如下:
'{' ':' <fill> <align> <width> '}'
Run Code Online (Sandbox Code Playgroud)
其中width是常数或对类型参数的引用<argument_index> '$'.所以3意味着常数3的宽度,并且1$意味着第一个参数的宽度println!.
但是:这里我们有点"滥用"这个功能,我们不要忘记我们只是为其他一些可打印的东西指定"填充",这是由参数传递给的println.这可能是一个空字符串.
println!("love: {:?<3}", ""); // love: ???
println!("love: {:?<1$}", "", 5); // love: ?????
Run Code Online (Sandbox Code Playgroud)
以下是我们不传递空字符串的一些示例:
println!("love: {:?<5}", "#"); // love: #????
println!("love: {:?>5}", "#"); // love: ????#
println!("love: {:?^5}", "#"); // love: ??#??
Run Code Online (Sandbox Code Playgroud)
从 1.16 开始你可以使用.repeat()从 1.16 开始你可以像这样
fn main() {\n println!("Here is love for you: {}", "\xe2\x99\xa5".repeat(10));\n}\nRun Code Online (Sandbox Code Playgroud)\n\n
如果您想要一种更简洁的方法来重复任何Display可用的项目而不创建中间分配,您可以创建一个包装器结构并编写一个Display执行重复的自定义实现:
use std::fmt::{self, Display};\n\n#[derive(Clone, Copy)]\nstruct DisplayRepeat<T>(usize, T);\n\nimpl<T: Display> Display for DisplayRepeat<T> {\n fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n for _ in 0..self.0 {\n self.1.fmt(f)?;\n }\n Ok(())\n }\n}\n\nfn repeat<T>(times: usize, item: T) -> DisplayRepeat<T> {\n DisplayRepeat(times, item)\n}\n\nfn main() {\n println!("Here is love for you: {}", repeat(10, '\xe2\x99\xa5'));\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1039 次 |
| 最近记录: |