使用println打印字符的次数可变

时间:2016-02-08 22:44:51

标签: rust

我想使用println!format!强大的格式化工具来打印特定次数的字符。当然这可以通过循环来实现,如下所示:

fn give_love(count: usize) {
    print!("Here is love for you: ");
    for i in 0..count {
        print!("♥");
    }
    println!("");
}

但我既不想写循环也不想写三个print。如何更短/更好?

2 个答案:

答案 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, '♥'));
}