我想使用println!
和format!
强大的格式化工具来打印特定次数的字符。当然这可以通过循环来实现,如下所示:
fn give_love(count: usize) {
print!("Here is love for you: ");
for i in 0..count {
print!("♥");
}
println!("");
}
但我既不想写循环也不想写三个print
。如何更短/更好?
答案 0 :(得分:5)
fn give_love(count: usize) {
println!("Here is love for you: {:♥<1$}", "", count);
}
您可以(错误地)使用填充功能,该功能允许使用您选择的某些字符填充打印值。仅此功能的语法如下:
'{' ':' <fill> <align> <width> '}'
其中width
是常数或对<argument_index> '$'
类型的参数的引用。因此,3
表示宽度为常数3,而1$
表示第一个参数println!
的值的宽度。
然而:在这里我们有点“滥用”这个功能,我们不能忘记我们只是为其他一些可打印的东西指定“填充”,它通过参数传递给println
。这可能是一个空字符串。
println!("love: {:♥<3}", ""); // love: ♥♥♥
println!("love: {:♥<1$}", "", 5); // love: ♥♥♥♥♥
以下是我们不传递空字符串的一些示例:
println!("love: {:♥<5}", "#"); // love: #♥♥♥♥
println!("love: {:♥>5}", "#"); // love: ♥♥♥♥#
println!("love: {:♥^5}", "#"); // love: ♥♥#♥♥
答案 1 :(得分:3)
如果您想要一种更干净的方法来重复任何Display
项而不创建中间分配,则可以创建包装器结构并编写一个自定义的Display
实现来执行重复操作:
use std::fmt::{self, Display};
#[derive(Clone, Copy)]
struct DisplayRepeat<T>(usize, T);
impl<T: Display> Display for DisplayRepeat<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for _ in 0..self.0 {
self.1.fmt(f)?;
}
Ok(())
}
}
fn repeat<T>(times: usize, item: T) -> DisplayRepeat<T> {
DisplayRepeat(times, item)
}
fn main() {
println!("Here is love for you: {}", repeat(10, '♥'));
}