1

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

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

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

有没有办法在不使用的情况下获取参数的字符串.to_string()

4

1 回答 1

4

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

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

第二个选项不适用于您的情况,因为您正在实施write_fmt, 和write!调用write_fmt,因此这可能会导致无限递归。但是您仍然可以调用write(&mut self, args). write的实现只使用write_str,而不是write_fmt

事实上,提供的实现Write::write_fmt正是这样做的:

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

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

于 2021-10-07T20:22:48.947 回答