在没有堆分配的情况下从 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
,除非您有 非常 特定要求。
我想让 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
,除非您有 非常 特定要求。