将.fmt行为与嵌套列表混淆 [英] Confusing .fmt behavior with nested Lists

查看:4
本文介绍了将.fmt行为与嵌套列表混淆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

docsfmt

返回一个字符串,其中列表中的每个元素都已根据$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|

即,将格式字符串应用于内部列表中的每个元素,然后对这些列表进行字符串化(使用格式字符串而不是;请注意每个|字符之间的 ),然后在每个外部列表之间插入分隔符。

这给我留下了三个问题:

  1. 我对当前行为的描述/理解正确吗?[编辑:没有。见下文]
  2. 这种行为是故意的还是奇怪的漏洞?(我检查了Roast,但两种方式都没有看到任何内容)
  3. 假设这是故意的,为什么?这是否与Raku处理我遗漏的列表的一般方法一致?还是其他原因导致了这种(IMO)令人惊讶的行为?

编辑:

进一步研究后,我意识到上面观察到的行为只有在格式字符串包含Width指令时才会发生。将→%03s|格式字符串从上面更改为→%s|会产生以下输出:

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

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

所以我又被弄糊涂了/我想至少其中一些行为肯定是有问题的。

推荐答案

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

这篇关于将.fmt行为与嵌套列表混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆