1 个不稳定版本

0.1.0 2023 年 9 月 7 日

Rust 模式 中排名第 2253

每月下载量 23

MIT 许可证

16KB
153

Rust 库,用于显示 Option

用法

use show_option::prelude::*;

println!("received bytes: {}", None::<usize>.show_or("none")); // "received bytes: none"
println!("amount: {}", Some(20).show_prefixed_or("$", "-")); // "amount: $20"
println!("amount: {}", format_option!(Some(20), "${}", "-")); // "amount: $20"

lib.rs:

扩展方法和方便的宏,用于格式化 Option,无需代码重复和分配。

用法

// Import all
use show_option::prelude::*;

// OR, if you prefer, import explicitly only what you need:
use show_option::ShowOption as _; // Extension methods for `Option`.
use show_option::format_option; // Macro

// Display 'Option's
println!("received bytes: {}", None::<usize>.show_or("none")); // "received bytes: none"
println!("amount: {}", Some(20).show_prefixed_or("$", "-")); // "amount: $20"
println!("amount: {}", format_option!(Some(20), "${}", "-")); // "amount: $20"

请参阅 ShowOption 文档中的完整方法列表。也可以查看 format_option 宏。

如果您想在许多地方应用相同的格式化,请考虑创建函数

fn format_amount(amount: &Option<usize>) -> impl Display + '_ {
    amount.show_prefixed_or("$", "-")
}
println!("amount: {}", format_amount(&Some(20))); // prints "amount: $20"

有时创建具有自己 Display 实现的新包装类型可能是更好的解决方案。

动机

Option 类型故意不实现 Display,因为它的格式化是上下文相关的。应该将 ""none" 格式化为空字符串,""none",还是 ""missing"

处理它的方法之一是条件格式化

let bytes = Some(20);
match bytes {
    Some(value) => println!("bytes received: {}", value),
    None => println!("bytes received: none"),
}

它非常灵活,但会导致格式化字符串重复。

另一种方法是在格式化之前将可选值转换为它的表示形式。在简单的情况下,当默认值与内部值具有相同的类型时,它有效

let bytes = Some(20);
println!("bytes received: {}", bytes.unwrap_or(0));

但是,当类型不同时,它会导致代码冗长和不需要的字符串分配

let bytes = Some(20);
println!("bytes received: {}", bytes.map_or("none".to_string(), |value| value.to_string()));
//                                                 ↑ allocation               ↑ allocation

可以通过将两个分支都转换为 Display 特性引用来避免分配,但这非常冗长

use std::fmt::Display;

let bytes = Some(20);
println!("bytes received: {}", bytes.as_ref().map_or(&"none" as &dyn Display, |value| value as &dyn Display));

此crate基本上将最后一种解决方案封装成优雅的方法。

依赖关系

~5KB