【发布时间】:2020-10-16 17:54:20
【问题描述】:
core::fmt::Arguments 的文档指出:
此结构表示格式字符串及其参数的安全预编译版本。这不能在运行时生成,因为它不能安全地完成,因此没有给出构造函数并且字段是私有的以防止修改。
在运行时生成这样一个无法安全完成的结构究竟是什么?
【问题讨论】:
标签: rust
core::fmt::Arguments 的文档指出:
此结构表示格式字符串及其参数的安全预编译版本。这不能在运行时生成,因为它不能安全地完成,因此没有给出构造函数并且字段是私有的以防止修改。
在运行时生成这样一个无法安全完成的结构究竟是什么?
【问题讨论】:
标签: rust
其实我觉得这句话有点误导。您可以使用format_args! 在运行时创建Arguments 的值。您不能做的是使用任意字符串格式表达式构建Arguments。
这是因为 Arguments 中的主要不变量是:
例如,如果你的字符串格式是"{0}{1:?}{2:x}{2:X}",那么你必须有三个参数:第一个必须实现Display,第二个必须实现Debug,第三个必须实现LowerHex + UpperHex。
您可以创建一个 API 以在运行时使用此类不变量构建 Arguments,但不能使用非常量格式字符串。因为你怎么知道需要什么特征?那有什么意义呢?如果您想不使用字符串格式来格式化您的对象,那么首先没有理由需要Arguments。
通过要求字符串是文字,宏 format_args! 可以在编译期间检查参数是否实现了正确的特征。
【讨论】:
format! 中(这个特定的宏也不能输出format! 调用)。
format! 的宏很棘手。但有时它们可以做到,如果你能说服编译器你的宏总是发出正确的代码,就像在这个toy playground中一样。也许您可以就此提出一个问题?
format! 调用,而我的不能这样做(它在项目位置调用)。