The docs https://docs.raku.org/routine/fmt比如说fmt
返回一个字符串,其中列表中的每个元素都已根据以下格式进行格式化$format
[第一个参数] 并且每个元素由$separator
[第二个论点]。
根据该描述,我希望能够致电.fmt
在列表的列表上,然后传递printf
-style 格式字符串包含%
内部列表中每个元素的指令。但这是行不通的。
如果你告诉我我错了^^^^,我就预料到了.fmt
自动展平其参数,因此每个参数都将被格式化并由$separator
。但事实并非如此。
相反,运行此代码
say (<a b c>, <1 2 3>, <X Y Z>).fmt('→%03s|', "\n=================\n");
产生这个输出:
→00a| →00b| →00c|
=================
→001| →002| →003|
=================
→00X| →00Y| →00Z|
也就是说,格式字符串应用于中的每个元素inner列表,然后将这些列表字符串化(without使用格式字符串;请注意
每个之间|
and →
字符),然后在每个字符之间插入分隔符outer list.
这给我留下了三个问题:
- 我是否正确描述/理解了当前的行为? [edit: 没有。见下文]
- 这种行为是故意的还是奇怪的错误? (我检查了 Roast,但没有看到任何东西)
- 假设这是故意的,为什么?有什么方法可以使这与 Raku 处理我缺少的列表的一般方法一致吗?或者这种令人惊讶的行为的其他原因?
Edit:
经过进一步调查,我意识到只有在格式字符串包含宽度指令时才会发生上面观察到的行为。改变→%03s|
将上面的字符串格式化为→%s|
产生以下输出:
→a b c|
=================
→1 2 3|
=================
→X Y Z|
也就是说,如果没有宽度,则应用格式字符串after该列表是字符串化的而不是以前的。
所以我又开始感到困惑/认为至少其中一些行为一定是有问题的。