【问题标题】:Confusing .fmt behavior with nested Lists将 .fmt 行为与嵌套列表混淆
【发布时间】:2021-11-07 06:07:40
【问题描述】:

docsfmt

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

基于该描述,我希望能够在列表列表上调用.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列表中的每个元素,然后这些列表被字符串化(没有使用格式字符串;注意 在每个 | 字符之间),然后在每个 outer 列表之间插入分隔符。

这给我留下了三个问题:

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

编辑:

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

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

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

所以我又回到了困惑/认为至少其中一些行为一定是错误的。

【问题讨论】:

  • “(imo)令人惊讶”。 Imo 惊喜总是与推测相关,无论是由于智力推测而产生的智力,还是由于身体推测而产生的身体。由于个人的接线、知识等,猜测总是主观的。所以惊喜也总是主观的。如果你的猜测发生了变化,以至于从前的惊喜不再是智力上的惊喜,那么你对惊喜的体验最终会消失,尽管你的身体需要一段时间才能赶上,不管这种猜测的变化是不是智力上的” Ahhh”(这是一个错误)或“Ohhh”(这不是一个错误)。现在,Q是什么? ??????
  • 该条件是一种廉价的方法来检查它是否真的只有一个 %s 在字符串中:然后,但只有这样,才会采用一个捷径,它只会插入元素作为.Str,而无需调用相对昂贵的sprintf 处理。

标签: formatting printf nested-lists raku rakudo


【解决方案1】:

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

【讨论】:

  • 感谢您的回答和修复!仅作记录,正确的行为/补丁落地后会是什么?
  • “我原以为 .fmt 会自动扁平化它的参数,因此每个参数都会被格式化并由 $separator 分隔。”这是它应该在第一个中具有的行为地方。补丁已经登陆了,现在只需要有人写一些测试:-​​)
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 2014-01-20
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多