【问题标题】:Why can't fmt::Arguments be safely generated at runtime?为什么不能在运行时安全地生成 fmt::Arguments?
【发布时间】:2020-10-16 17:54:20
【问题描述】:

core::fmt::Arguments 的文档指出:

此结构表示格式字符串及其参数的安全预编译版本。这不能在运行时生成,因为它不能安全地完成,因此没有给出构造函数并且字段是私有的以防止修改。

在运行时生成这样一个无法安全完成的结构究竟是什么?

【问题讨论】:

    标签: rust


    【解决方案1】:

    其实我觉得这句话有点误导。您可以使用format_args! 在运行时创建Arguments 的值。您不能做的是使用任意字符串格式表达式构建Arguments

    这是因为 Arguments 中的主要不变量是:

    1. 每个占位符都有一个参数。
    2. 每个参数至少使用一次。
    3. 每个参数都实现正确的特征,每个参数都实现正确的特征。

    例如,如果你的字符串格式是"{0}{1:?}{2:x}{2:X}",那么你必须有三个参数:第一个必须实现Display,第二个必须实现Debug,第三个必须实现LowerHex + UpperHex

    您可以创建一个 API 以在运行时使用此类不变量构建 Arguments,但不能使用非常量格式字符串。因为你怎么知道需要什么特征?那有什么意义呢?如果您想不使用字符串格式来格式化您的对象,那么首先没有理由需要Arguments

    通过要求字符串是文字,宏 format_args! 可以在编译期间检查参数是否实现了正确的特征。

    【讨论】:

    • 谢谢你——这很有意义。至于“那有什么意义?”:我想使用已提供给我的 proc 宏的字符串格式来格式化对象,所以是令牌形式——我可以对令牌进行字符串化,但当然我不能使用它们在format! 中(这个特定的宏也不能输出format! 调用)。
    • @eggyal:啊,带有format! 的宏很棘手。但有时它们可​​以做到,如果你能说服编译器你的宏总是发出正确的代码,就像在这个toy playground中一样。也许您可以就此提出一个问题?
    • 但这需要宏扩展为format! 调用,而我的不能这样做(它在项目位置调用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2013-10-24
    • 2013-05-26
    • 2022-01-27
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多