#string-formatting #format-text #format-string #string #format #macro #text

macro inline_format

一组更易读的字符串格式化宏

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值格式化

Download history 6/week @ 2024-03-11 30/week @ 2024-04-01 25/week @ 2024-04-08 7/week @ 2024-04-22 13/week @ 2024-05-20 8/week @ 2024-06-03 8/week @ 2024-06-10 21/week @ 2024-06-17 15/week @ 2024-06-24

每月 52 次下载
gdnative_tweener 中使用

MIT 许可证

17KB
290

inline_format

GitHub Badge crates.io Badge docs.rs Badge Build Status Badge

一组更易读的字符串格式化宏。

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