将.fmt行为与嵌套列表混淆 [英] Confusing .fmt behavior with nested Lists
本文介绍了将.fmt行为与嵌套列表混淆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
docs说fmt
基于该描述,我希望能够对列表列表调用返回一个字符串,其中列表中的每个元素都已根据
$format
[第一个参数]进行了格式化,并且每个元素由$separator
[第二个参数]分隔。
.fmt
,然后为内部列表中的每个元素传递包含%
指令的printf
样式的格式字符串。但这并不管用。
如果您告诉我我对^的看法是错误的,我会预料到.fmt
会自动平整其参数,因此每个参数都会被格式化,并由$separator
分隔。但这也不是事实。
相反,运行此代码
say (<a b c>, <1 2 3>, <X Y Z>).fmt('→%03s|', "
=================
");
生成此输出:
→00a| →00b| →00c|
=================
→001| →002| →003|
=================
→00X| →00Y| →00Z|
即,将格式字符串应用于内部列表中的每个元素,然后对这些列表进行字符串化(使用格式字符串而不是;请注意每个|
和→
字符之间的
),然后在每个外部列表之间插入分隔符。
这给我留下了三个问题:
- 我对当前行为的描述/理解正确吗?[编辑:没有。见下文]
- 这种行为是故意的还是奇怪的漏洞?(我检查了Roast,但两种方式都没有看到任何内容)
- 假设这是故意的,为什么?这是否与Raku处理我遗漏的列表的一般方法一致?还是其他原因导致了这种(IMO)令人惊讶的行为?
编辑:
进一步研究后,我意识到上面观察到的行为只有在格式字符串包含Width指令时才会发生。将→%03s|
格式字符串从上面更改为→%s|
会产生以下输出:
→a b c|
=================
→1 2 3|
=================
→X Y Z|
也就是说,如果没有宽度,格式字符串将在列表被字符串化之后而不是之前应用。
所以我又被弄糊涂了/我想至少其中一些行为肯定是有问题的。
推荐答案
好的,看起来这里至少有两个错误。这应该用https://github.com/rakudo/rakudo/commit/a86ec91e36修复。为这些情况编写规范测试将不胜感激:-)
这篇关于将.fmt行为与嵌套列表混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文