在没有堆分配的情况下从 fmt::Arguments 获取数据

Getting data from a fmt::Arguments without heap allocation

我想让 write! 在我自己的实现 fmt::Write 的结构上工作,但我没有任何堆分配。为此,我需要实施 fmt::Write::write_fmt(&mut self, args: fmt::Arguments<'_>) -> fmt::Result

但是,这意味着我需要在不使用 &args.to_string() 的情况下访问 fmt::Arguments<'_> 中的数据,因为没有堆分配 .to_string() 就不存在。

Arguments::as_str,但是当我需要将元素格式化为 i32.

时它不起作用

有没有办法不使用 .to_string() 来获取参数的字符串?

Arguments<'_> 包含一个预解析的参数字符串和随它传递的参数。你不能分解它或弄乱内部结构,因为那样是不安全的,所以你可以对它做的唯一合理的事情是:

  • 将其传递给 core::fmt::write(或 std::fmt::format,但 returns 一个 String
  • 或将其与 "{}""{:?}" 格式字符串一起传递给其中一个格式化宏(例如 write!)。

第二个选项在您的情况下不起作用,因为您正在实施 write_fmt,并且 write! 调用 write_fmt,因此这可能会导致无限递归。但是你仍然可以只调用 write(&mut self, args)write's implementation only uses write_str, not write_fmt.

事实上,provided implementation of Write::write_fmt 正是这样做的:

fn write_fmt(mut self: &mut Self, args: Arguments<'_>) -> Result {
    write(&mut self, args)
}

由于这已经存在,并且没有合理的替代实现,您可能根本不应该覆盖 write_fmt,除非您有 非常 特定要求。