【问题标题】:How to destructure for loop parameters into array of fixed size?如何将循环参数解构为固定大小的数组?
【发布时间】:2020-04-08 08:45:15
【问题描述】:

我正在尝试将 for 循环中的参数放入 FIXED 大小的数组中。这就是我一直在做的事情(我想使用一个包含 3 个元素的数组 @m):

for (1..19).rotor(3, :partial) -> @m { say @m; } # works, but I cannot specify size of @m

但是,以下所有内容都会给我错误:

for (1..19).rotor(3, :partial) -> @m[0,1,2] { say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> ).rotor(3, :partial) -> @m[0,1,2] { say ⏏@m; }

for (1..19).rotor(3 => -2) -> @m[0..2] { say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> 1..19).rotor(3 => -2) -> @m[0..2] { say ⏏@m; }

for (1..19).rotor(3 => -2) -> @m[3] { say $_; say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> ).rotor(3 => -2) -> @m[3] { say $_; say ⏏@m; }

那么,我应该如何指定数组 @m 必须只有 3 个元素?

【问题讨论】:

  • 嗨 lisprogtor。这里倾向于不签名的帖子,以及一般简洁的风格。我能麻烦您不要添加这些吗?
  • 我经常建议以下几点:请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。
  • 在这里礼貌一点都不行吗?
  • 这不是礼貌问题;这是技术写作的问题。 This discussion 可能是典型的。 This discussion 涵盖了希望表达礼貌的人的类似理由。简短的回答是这些讨论之前已经进行过,并且已经达成了关于更喜欢简洁的解决方案。如果您希望社区改变路线,您可以自己参与这些讨论。
  • 总的来说(志愿)编辑在修改问题时会考虑到这些准则,当社区成员对他们的个人风格进行小幅调整时,他们非常感激,以免创建新的编辑工作。

标签: arrays for-loop raku destructure


【解决方案1】:

问题的标题提到了解构,但那是关于拆开一些东西。例如,我们可以使用它提取三个元素:

for (1..19).rotor(3, :partial) -> [$a, $b, $c] {
}

然而,这似乎并不是一个真正的解构问题,因为请求不是将传递的聚合分解为其部分,而是将其转换为不同类型的聚合。

进一步看问题:

我正在尝试将 for 循环中的参数放入 FIXED 大小的数组中。

问题是,rotor 根本不会产生(可变的)Arrays。相反,在写作时:

for (1..19).rotor(3, :partial) -> @m {
}

那么@m 就是ListList 是不可变的(因此它的大小隐含地在创建时是固定的),因此如果意图是不会意外更改大小,那已经是一个证书。不幸的是,没有说明最终目标。

如果真的想将传递的不可变List 变成有形状的Array,除了将其分配为新的固定大小Array 之外别无他法:

for (1..19).rotor(3, :partial) -> @l {
    my @arr[3] = @l;
}

当然,如果:partial 导致剩余元素,这将会爆炸;可以这样做:

for (1..19).rotor(3, :partial) -> @l {
    my @arr[@l.elems] = @l;
}

为了避免这种情况。但是,如果目标真的是确保在有剩余元素时事情会爆炸,那么where

for (1..19).rotor(3, :partial) -> @m where .elems == 3 {
}

或者,不太清楚,一次性的解构:

for (1..19).rotor(3, :partial) -> @m [$,$,$] {
}

会做的。

【讨论】:

  • 非常感谢乔纳森·沃辛顿的帮助!!!一次性的解构对我来说是新的,我会更多地研究它。谢谢!!!
【解决方案2】:

所以-> @m[3] 是您想要的,但这是为您的匿名块分配一个签名,该块需要一个整形数组并且您正在传递一个列表。

所以我最终所做的可能会将我的列表强制转换为一个成形的数组。

for (1..19).rotor(3, :partial).map( { Array.new(:shape(3),$_ ) } ) -> @m[3] { say @m; }

然后它工作正常。不过,可能有更好的方法来做到这一点。

【讨论】:

  • 如果您确定数组将有 3 个元素,那么为什么要对其进行整形?
  • 这会因@m is not declared 而失败。你是说@m吗?
  • 我从命令行粘贴了它,它工作正常。
  • @ScimonProctor 它与 raku 2019.11 无关; 2020.02 也是如此。消除 [3] 对两者都有效。
  • 啊啊啊啊。是的,我想知道它是否可能是那样的。我知道成形数组很新。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2010-12-30
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
相关资源
最近更新 更多