raku - Perl 6中带有数组值的散列

标签 raku

这里发生了什么?

为什么是 %a{3}%a{3}.Array如果 %a 则不同有 Array值和 %a{3}Array ?

> my Array %a
{}
> %a{3}.push("foo")
[foo]
> %a{3}.push("bar")
[foo bar]
> %a{3}.push("baz")
[foo bar baz]
> .say for %a{3}
[foo bar baz]
> %a{3}.WHAT
(Array)
> .say for %a{3}.Array
foo
bar
baz

最佳答案

此处观察到的差异与以下相同:

my $a = [1,2,3];
.say for $a;        # [1 2 3]
.say for $a.Array;  # 1\n2\n3\n
$ sigil 可以被认为是“单个项目”的意思。因此,当给 for ,它会看到并说“啊哈,一个项目”并运行一次循环。此行为在 for 中是一致的。和 运算符和例程 .例如,这是给定数组的 zip 运算符,它们是逐项数组:
say [1, 2, 3] Z [4, 5, 6];    # ((1 4) (2 5) (3 6))
say $[1, 2, 3] Z $[4, 5, 6];  # (([1 2 3] [4 5 6]))

相比之下,方法调用和索引操作将始终根据 Scalar 内部的内容调用容器。调用 .Array实际上是一个空操作,因为它在 Array 上被调用已经,它有趣的工作实际上是在方法调用本身的行为中,它正在展开 Scalar容器。 .WHAT就像一个方法调用,告诉你任何 Scalar 的内容。容器。

数组和散列的值 - 默认情况下 - Scalar容器反过来持有值(value)。但是,.WHAT用于查看值隐藏了它,因为它与 Scalar 中的内容有关.相比之下,.perl [1] 清楚地表明有一个项目:
my Array %a;
%a{3}.push("foo");
%a{3}.push("bar");
say %a{3}.perl;      $["foo", "bar"]

有多种方法可以删除项目:
%a{3}.Array     # Identity minus the container
%a{3}.list      # Also identity minus the container for Array
@(%a{3})        # Short for %a{3}.cache, which is same as .list for Array
%a{3}<>         # The most explicit solution, using the de-itemize op
|%a{3}          # Short for `%a{3}.Slip`; actually makes a Slip

我可能会使用 for %a{3}<> { }在这种情况下;它比方法调用更短,并且清楚地表明我们这样做纯粹是为了删除项目而不是强制。

for |%a{3} { }也可以正常工作并且视觉效果很好,它是唯一一个没有优化到简单地从其 Scalar 中删除某些东西的工具。容器,而是制作一个中间 Slip对象,它可能会稍微减慢迭代速度(尽管取决于循环完成了多少工作,这很可能是噪音)。

[1] 根据我写的内容,有人可能想知道为什么 .perl可以恢复某些内容已逐项列出的事实。方法调用 $foo.bar真的在做类似 $foo<>.^find_method('bar')($foo) 的事情.然后,在 method bar() { self } , self绑定(bind)到调用该方法的对象,从其容器中删除。但是,可以写成 method bar(\raw-self:) { }以完全按照提供的方式恢复它。

关于raku - Perl 6中带有数组值的散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50299548/

相关文章:

sockets - perl6 IO::Socket::INET 无法从套接字接收数据:连接被对等方重置

binding - 是否有一些模型可用于理解 Raku 中的容器、引用、原始、rw、\?

raku - 标记。^在Perl 6中是什么意思?

primes - 如何在 Perl 6 中有效地生成素数列表?

byte - Raku 中的 `bytes.fromhex` 和 `to_bytes` 方法?

尝试为 Markdown 定义语法时的 raku 语法问题

main - 我可以捕获 RUN-MAIN 中使用的例程的返回值吗?

arrays - 在Perl 6中如何知道多值迭代期间的缺失值?

raku - Perl6 cmp的两个字符串可以不区分大小写吗?

signature - 当您提供相同代码的异步变体时,约定是什么?