0

我是 Rust 的新手,因此在传递给println!宏时我正在尝试各种参数。当我尝试以下代码时,我可以成功编译它。

println! (" let the world be in peace {number:0width$} ",number = 1.1414, width = 9);

输出如下:

let the world be in peace 0001.1414

因此我的理解是基于 的值width, 的值0作为填充添加到输出中。但是当我尝试将以下代码添加1为填充时,会导致编译错误:

println! ("let me know {number:1width$}",number = 1.1414, width = 9); 

编译错误堆栈如下:

    error: invalid format string: expected `'}'`, found `'$'`
  --> print_statements.rs:25:42
   |
25 |     println! ("let me know {number:1width$}",number = 1.1414, width = 9);
   |                            -             ^ expected `}` in format string
   |                            |
   |                            because of this opening brace
   |
   = note: if you intended to print `{`, you can escape it using `{{`

error: aborting due to previous error

我错过了什么吗?感谢您的帮助!

4

1 回答 1

3

虽然命名约定可能会让人觉得1width(或 前面的任何数字width)是有效的,但事实并非如此。0 是一个特定的数字格式标志,用于用 0 填充数字,而不是像正常的空格。

考虑一下宽度的目的可能会有所帮助,为什么会出现这种情况。宽度确保一个值至少占用特定数量的字符(用于对齐多行),方法是使用不会改变打印内容值的填充字符填充剩余空间。0 作为与空格相比的额外选择,因为在数字的开头/结尾添加 0 不会更改值,但添加 1 会以不可预测的方式(基于数字长度)完全更改打印值。

也就是说,rust 提供了填充/对齐方式来指定用作宽度填充的字符。使用它,您println!将变为以下内容:

println!("let me know {number:1>width$}", number = 1.1414, width = 9); 
于 2021-05-30T21:48:28.630 回答