【问题标题】:perl6 array assignment: pointer or copy?perl6 数组赋值:指针还是副本?
【发布时间】:2017-04-14 03:03:20
【问题描述】:

在 perl6 中,我想将一个数组分配给另一个数组,并使结果数组成为不同的实体,但似乎直接分配或克隆都不能满足我的要求。有没有办法用一个表达式复制数组而不是编写循环例程?

To exit type 'exit' or '^D'
> my @a=<a b c d e>
[a b c d e]
> my @b = <1 2 3 4 5 6 7>
[1 2 3 4 5 6 7]
> my @c = @a
[a b c d e]
> @c[3]
d
> @c[3]=3;
3
> @c
[a b c 3 e]
> @a
[a b c d e]
> @c === @a
False
> @c == @a
True          # this is unexpected, @c and @a should be different, right?
> my @x=@a.clone
[a b c d e]
> @x[3]=3
3
> @x
[a b c 3 e]
> @x === @a
False
> @x == @a
True         # unexpected, @x and @a should be distinct things, right?
>

非常感谢!!!

lisprog

【问题讨论】:

    标签: arrays pointers clone variable-assignment raku


    【解决方案1】:

    你很不幸没有与可能帮助你弄清楚的@b进行比较:)

    == 是数字比较,因此当您要求将列表作为数字进行比较时,它会选择元素的数量作为表示。 Perl 5 或 6 中的运算符强制相关类型。如果要测试数组的元素是否相同,请尝试 eqv 运算符。

    比较数组的长度,所以以下是正确的:

    @a == @c == @x == 5
    

    试试:

    my @a = <a b c d e>;
    my @b = <1 2 3 4 5>;
    @a eqv @b;
    

    您可能想查看有关这些运算符的一些文档。智能匹配 ~~ 运算符可能更符合您对 == 的期望。

    https://docs.perl6.org/routine/$EQUALS_SIGN$EQUALS_SIGN https://docs.perl6.org/routine/$TILDE$TILDE

    【讨论】:

    • 谢谢马特!所以,当我将一个数组分配给另一个数组时,内容被复制并且它们是不同的数组,对吧?
    • 是和不是。你得到一个标量类型的浅拷贝。所以像容器这样的东西说另一个数组你只会得到一个指向同一个列表的新容器。这是一个可能不是您所期望的示例:my @a = [1,[2,3]]; my @b = @a; @b[1][0] = 4; 这也会将 @a 中的 2 更改为 4!
    • 如果你想要一个深拷贝,那么这里之前已经回答了这个问题stackoverflow.com/questions/38582873/…
    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多