【问题标题】:Perl 6 assignment hyper operator for nested list doesn't work as expected嵌套列表的 Perl 6 赋值超级运算符无法按预期工作
【发布时间】:2023-03-17 19:23:01
【问题描述】:

您好,我正在尝试在Perl 6 https://docs.perl6.org/language/operators#Hyper_operators 中使用赋值超级运算符

my (@one, @two) «=» (<1 2 3>,<4 5 6>);
say @one;
say @two;
# Prints nothing (empty array)

# Expected behaviour:
@one=<1 2 3>;
@two=<4 5 6>;
say @one;
say @two;
# Prints [1 2 3] and [4 5 6]

如何让赋值超算子正确运行?谢谢。

【问题讨论】:

  • 根据文档,hyperops 循环遍历由超符号指向的列表/数组的元素(即,如果使用 «op...,则列表在左侧,如果使用 ...op»,则在右侧列表使用)如果它比其他列表短。但是左边的数组是完全空的,所以有个元素要循环,所以所有的赋值都消失在天空中的大比特桶中。
  • 感谢您的评论和澄清。看起来对分配任务使用超运算符不适合嵌套列表。这显然是由 = 操作员在分配列表时无法执行 assignment 引起的。幸运的是,zip 运算符作为元运算符按预期运行。
  • 嗨@Romario。如果目标列表没有元素,则不适合使用 initialization,因此排除了您的示例,但它适用于 assignment,包括嵌套列表,如果cycling 是需要的和/或 autovivification / autoextending 不是。因此,例如,my (@a, @b); @a[2] = @b[2] = Nil; (@a, @b) «=» (&lt;1 2 3&gt;, &lt;4 5 6 7&gt;); say @a, @b; 显示 [1 2 3][7 5 6]

标签: raku


【解决方案1】:

你很亲密。在我们找到的文档中再往下一点

zip 元运算符(与 Z 不同)会将给定的中缀运算符应用于从其参数中取一左一右的对。

所以

my (@one, @two) Z= <1 2 3>, <4 5 6>;

这是一个基准,在当前的开发人员版本上运行。它将上面的“魔术”变体与两个顺序赋值进行比较。

use v6;
use Benchmark;

my %results = timethese(100000, {
    "magic" => sub { my (@one, @two) Z= <1 2 3>, <4 5 6> },
    "plain" => sub { my @one = <1 2 3>; my @two = <4 5 6> },
});

say ~%results;

# magic   1569668462 1569668464 2 0.00002
# plain   1569668464 1569668464 0 0

【讨论】:

  • 我认为这是一场高尔夫。从性能的角度来看,my @one = &lt;1 2 3&gt;; my @two = &lt;4 5 6&gt; 会快几个数量级。我只是说:Perl 6 有很多特性,但你不必一直使用它们 :-)
  • @ElizabethMattijsen 实际上,没有显着差异。见上文。
  • @ElizabethMattijsen 基本上,我关心的不是性能,而是以一种优雅的方式进行分配。这种分配方式是代码方面可扩展的,即您可以分配多变量合二为一,简洁的一步。当然这也取决于程序员的看法。
  • @Holli 觉得 Benchmark 模块存在问题:for ^100000 { my (@one, @two) Z= &lt;1 2 3&gt;, &lt;4 5 6&gt; }; say now - INIT now 对我来说是 1.25 秒,for ^100000 { my @one = &lt;1 2 3&gt;; my @two = &lt;4 5 6&gt; }; say now - INIT now 说是 0.12 秒。所以这是我书中 10 倍的差异。
  • 在我的系统上它更像是 7 倍,但是是的。
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2011-06-14
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多