Rust 为什么可以';在运行时是否可以安全地生成参数?

Rust 为什么可以';在运行时是否可以安全地生成参数?,rust,Rust,各国的文件: 此结构表示格式字符串及其参数的安全预编译版本。这不能在运行时生成,因为它不能安全地完成,因此不提供构造函数,并且字段是私有的,以防止修改 在运行时生成这样一个不能安全完成的结构到底是什么原因?事实上,我认为这句话有点误导。您可以在运行时使用格式参数创建参数的值。您不能使用任意字符串格式表达式构建参数 这是因为参数中的主要不变量是: 每个占位符都有一个参数 每个参数至少使用一次 每个参数都实现了正确的特性,每个参数都实现了正确的特性 例如,如果字符串格式为“{0}{1:?}{2:x}

各国的文件:

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


在运行时生成这样一个不能安全完成的结构到底是什么原因?

事实上,我认为这句话有点误导。您可以在运行时使用
格式参数创建
参数的值。您不能使用任意字符串格式表达式构建
参数

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

  • 每个占位符都有一个参数
  • 每个参数至少使用一次
  • 每个参数都实现了正确的特性,每个参数都实现了正确的特性
  • 例如,如果字符串格式为
    “{0}{1:?}{2:x}{2:x}”
    ,则必须有三个参数:第一个参数必须实现
    显示
    ,第二个参数
    调试
    ,第三个参数
    LowerHex+UpperHex

    您可以创建一个API,在运行时使用这些不变量构建
    参数
    ,但不能使用非常量格式字符串。因为你怎么知道需要什么样的品质?那又有什么意义呢?如果希望不使用字符串格式格式化对象,那么首先就没有理由要求使用
    参数


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

    谢谢,这非常有意义。至于“这有什么意义?”:我想使用提供给我的proc宏的字符串格式格式化一个对象,所以是以令牌形式,我可以将令牌字符串化,但当然我不能以
    格式使用它们
    (这个特定的宏也不能输出
    格式!
    调用)。@eggyal:啊,带
    格式的宏很棘手。但有时,如果你能让编译器相信你的宏总是发出正确的代码,它们是可以做到的,如下所示。也许你可以就此提出一个问题?但这需要宏扩展为
    格式调用,这是我不能做的(它是在项目位置调用的)。