将 .fmt 行为与嵌套列表混淆

Confusing .fmt behavior with nested Lists

docs 表示 fmt

Returns a string where each element in the list has been formatted according to $format [the first argument] and where each element is separated by $separator [the second argument].

根据该描述,我希望能够对列表的列表调用 .fmt,然后传递包含 % 指令的 printf 样式格式字符串内部列表中的每个元素。但那是行不通的。

如果你告诉我我对 ^^^^ 的看法是错误的,我会预料到 .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 使用格式字符串;注意每个 | 字符之间的 ),然后在每个 outer 列表之间插入分隔符。

这给我留下了三个问题:

  1. 我 described/understood 当前的行为是否正确? [编辑:不。见下文]
  2. 这种行为是故意的还是奇怪的错误? (我检查了 Roast,但没有看到任何东西)
  3. 假设这是故意的,为什么?有什么方法可以使它与 Raku 处理我遗漏的列表的一般方法一致吗?或者这个(imo)令人惊讶的行为的其他原因?

编辑:

经过进一步调查,我意识到我在上面观察到的行为仅在格式字符串包含宽度指令时才会发生。将上面的 →%03s| 格式字符串更改为 →%s| 会产生以下输出:

→a b c|
=================
→1 2 3|
=================
→X Y Z|

也就是说,没有宽度,格式字符串在列表被字符串化之后而不是之前应用。

所以我又变回了 confused/thinking 至少其中一些行为肯定是有问题的。

好的,看来这里至少有两个错误。这应该用 https://github.com/rakudo/rakudo/commit/a86ec91e36 修复。为这些情况编写 spectests,将不胜感激:-)