混淆 .fmt 行为与嵌套列表

cod*_*ons 8 formatting printf nested-lists rakudo raku

文档说fmt

\n
\n

返回一个字符串,其中列表中的每个元素均已根据$format[第一个参数] 进行格式化,并且每个元素均由$separator[第二个参数] 分隔。

\n
\n

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

\n

如果您告诉我我对 ^^^^ 的看法是错误的,我会期望它.fmt会自动展平其参数,因此每个参数都会被格式化并由$separator. 但事实并非如此。

\n

相反,运行此代码

\n
\nsay (<a b c>, <1 2 3>, <X Y Z>).fmt(\'\xe2\x86\x92%03s|\', "\\n=================\\n");\n
Run Code Online (Sandbox Code Playgroud)\n

产生这个输出:

\n
\xe2\x86\x9200a| \xe2\x86\x9200b| \xe2\x86\x9200c|\n=================\n\xe2\x86\x92001| \xe2\x86\x92002| \xe2\x86\x92003|\n=================\n\xe2\x86\x9200X| \xe2\x86\x9200Y| \xe2\x86\x9200Z|\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,格式字符串应用于内部列表中的每个元素,然后对这些列表进行字符串化(使用格式字符串;注意 每个|\xe2\x86\x92字符之间),然后在每个外部列表之间插入分隔符列表之间插入分隔符。

\n

这给我留下了三个问题:

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

编辑:

\n

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

\n
\xe2\x86\x92a b c|\n=================\n\xe2\x86\x921 2 3|\n=================\n\xe2\x86\x92X Y Z|\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

所以我又开始感到困惑/认为至少其中一些行为一定是有问题的。

\n

Eli*_*sen 8

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

  • 感谢您的回答和修复!仅供记录,正确的行为是什么/补丁落地后会是什么? (2认同)