4 个版本
0.2.3 | 2023 年 8 月 23 日 |
---|---|
0.2.2 | 2023 年 8 月 23 日 |
0.2.1 | 2023 年 6 月 6 日 |
0.1.0 | 2023 年 6 月 2 日 |
#353 在 值格式化 中
每月 52 次下载
在 gdnative_tweener 中使用
17KB
290 行
inline_format
一组更易读的字符串格式化宏。
use inline_format::format;
let val = 2 + 2;
assert_eq!(
std::format!("text {{}} {val:04} text {:o}", 10 * 10),
format!("text {} " val:04 " text " 10 * 10:o)
);
特性
-
format!
宏。 -
write!
宏。 -
writeln!
宏。 -
print!
宏。 -
println!
宏。 -
eprint!
宏。 -
eprintln!
宏。 -
format_args!
宏。 - 可选的逗号分隔。
- 命名参数。
STD 问题
这个crate中的格式化宏几乎与 标准格式化宏 一样。
std宏有内联标识符,但缺乏对表达式的支持。
最终你可能需要分割你的表达式和它们在字符串中的位置。当添加更多参数并混合标识符和表达式时,这种模式会变得更糟。
除非将表达式保存到变量中,否则你可能需要计数并跟踪哪些参数在哪里,以及哪些格式化特性被应用。
修改这些参数甚至可能导致错误,尤其是在字符串内联转换时。 !("{val}") -> !("{}", val)
。
一个内置的解决方案是使用 命名参数,这确实改善了体验,但它仍然有缺点,即位于字符串之后。
用法
这个库通过将代码移至字符串外部,并去除(除了在 stream
目标中的 write!
和 writeln!
)独立的参数概念)解决了所有这些问题。
// Glob importing from it will cause a conflict with Rust's std prelude.
// If you'd like a different name there's always `inline_format::{format as iformat}`.
use inline_format::format;
let val = 2 + 2;
format!("text {} " val:04 " text " 10 * 10) // text {} 0004 text 100
// Comma separation is optional.
// All other examples will be without commas.
format!("text {} ", val:04, " text ", 10 * 10) // text {} 0004 text 100
现在,您可以一目了然地看到您的表达式在字符串中的位置,以及它们是否应用了任何格式化特性。这一切都是通过从左到右连续读取实现的。
除此之外,由于字符串内部不再有特殊语法,因此无需转义 {}
。
由于宏编译为 std 宏等效物,它们应该支持相同的功能,并执行您通常期望它们执行的操作。
更多示例
连接两个表达式。
要逐行连接多个表达式,请在它们之间放置 ""
。
format!(2 + 2 "" 10 * 10 :04) // 40100
使用块。
如果您有一个较长的表达式,可能需要将其放在块中。
format!({
let val = 2 + 2;
val
} "" 10 * 10 :04) // 40100
使用命名参数。
如果您想多次使用一个表达式,您可以给它命名并引用该名称。
格式特性应用于 部分而不是变量。
由于 format_args!
的工作方式,命名参数的生命周期不足以长时间存在,因此它们会自动为您克隆,而不是多次评估。
format!(x10 = 10 * 10:o " " x10) // 144 100
// Named parameters can also be surrounded in blocks.
// Format traits go outside the block.
format!({x10 = 10 * 10}:o " " x10) // 144 100
不平衡填充字符。
Rust 的宏语法 绝对不能 有不平衡的花括号或引号。
以下会产生错误。
format!(2:"<5)
为了修复这个问题,将特性放在引号内,如果它是 "
,则转义字符。
format!(2:"\"<5") // 2""""
依赖关系
~0.3–0.8MB
~19K SLoC