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

Luk*_*odt 5 rust

我想使用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.如何更短/更好?

Luk*_*odt 8

您的代码的解决方案

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)

  • 或者(提一个不太聪明的选择),你可以`重复('♥').take(count).collect :: <String>()` (3认同)

Mat*_*elk 6

从 1.16 开始你可以使用.repeat()从 1.16 开始你可以像这样

\n
fn main() {\n    println!("Here is love for you: {}", "\xe2\x99\xa5".repeat(10));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

游乐场链接

\n


Cha*_*er5 5

如果您想要一种更简洁的方法来重复任何Display可用的项目而不创建中间分配,您可以创建一个包装器结构并编写一个Display执行重复的自定义实现:

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n