Perl 6 是否有内置工具来制作嵌套数据结构的深拷贝?
Does Perl 6 have a built-in tool to make a deep copy of a nested data structure?
Perl 6 是否有内置工具来深度复制嵌套数据结构?
添加示例:
my %hash_A = (
a => {
aa => [ 1, 2, 3, 4, 5 ],
bb => { aaa => 1, bbb => 2 },
},
);
my %hash_B = %hash_A;
#my %hash_B = %hash_A.clone; # same result
%hash_B<a><aa>[2] = 735;
say %hash_A<a><aa>[2]; # says "735" but would like get "3"
my %A = (
a => {
aa => [ 1, 2, 3, 4, 5 ],
bb => { aaa => 1, bbb => 2 },
},
);
my %B = %A.deepmap(-> $c is copy {$c}); # make sure we get a new container instead of cloning the value
dd %A;
dd %B;
%B<a><aa>[2] = 735;
dd %A;
dd %B;
使用.clone
和.deepmap
请求一个copy/deep-copy数据结构。但不要打赌。任何对象都可以定义自己的 .clone
方法并用它做任何想做的事。如果您必须变异并因此必须克隆,请确保您使用大型数据集测试您的程序。糟糕的算法会使程序在生产使用中几乎毫无用处。
肮脏的方式:
#!/usr/local/bin/perl6
use v6;
use MONKEY-SEE-NO-EVAL;
my %hash_A = (
a => {
aa => [ 1, 2, 3, 4, 5 ],
bb => { aaa => 1, bbb => 2 },
},
);
my %hash_B;
EVAL '%hash_B = (' ~ %hash_A.perl ~ ' )';
%hash_B<a><aa>[2] = 735;
say %hash_A;
say %hash_B;
这给你:
$ perl6 test.p6
{a => {aa => [1 2 3 4 5], bb => {aaa => 1, bbb => 2}}}
{a => {aa => [1 2 735 4 5], bb => {aaa => 1, bbb => 2}}}
如果您评估来自外部源的输入,请始终记得先检查它。无论如何,使用 EVAL 是危险的,应该避免。
Perl 6 是否有内置工具来深度复制嵌套数据结构?
添加示例:
my %hash_A = (
a => {
aa => [ 1, 2, 3, 4, 5 ],
bb => { aaa => 1, bbb => 2 },
},
);
my %hash_B = %hash_A;
#my %hash_B = %hash_A.clone; # same result
%hash_B<a><aa>[2] = 735;
say %hash_A<a><aa>[2]; # says "735" but would like get "3"
my %A = (
a => {
aa => [ 1, 2, 3, 4, 5 ],
bb => { aaa => 1, bbb => 2 },
},
);
my %B = %A.deepmap(-> $c is copy {$c}); # make sure we get a new container instead of cloning the value
dd %A;
dd %B;
%B<a><aa>[2] = 735;
dd %A;
dd %B;
使用.clone
和.deepmap
请求一个copy/deep-copy数据结构。但不要打赌。任何对象都可以定义自己的 .clone
方法并用它做任何想做的事。如果您必须变异并因此必须克隆,请确保您使用大型数据集测试您的程序。糟糕的算法会使程序在生产使用中几乎毫无用处。
肮脏的方式:
#!/usr/local/bin/perl6
use v6;
use MONKEY-SEE-NO-EVAL;
my %hash_A = (
a => {
aa => [ 1, 2, 3, 4, 5 ],
bb => { aaa => 1, bbb => 2 },
},
);
my %hash_B;
EVAL '%hash_B = (' ~ %hash_A.perl ~ ' )';
%hash_B<a><aa>[2] = 735;
say %hash_A;
say %hash_B;
这给你:
$ perl6 test.p6
{a => {aa => [1 2 3 4 5], bb => {aaa => 1, bbb => 2}}}
{a => {aa => [1 2 735 4 5], bb => {aaa => 1, bbb => 2}}}
如果您评估来自外部源的输入,请始终记得先检查它。无论如何,使用 EVAL 是危险的,应该避免。