1 个不稳定版本
0.1.0 | 2023 年 9 月 7 日 |
---|
在 Rust 模式 中排名第 2253
每月下载量 23
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