我可以删除SetHash的元素并在Perl 6中使用它的值吗?

Eug*_*sky 3 perl6 raku

我想删除a的任何元素SetHash,以便返回其值:

my SetHash $a;
$a<m n k> = 1..*;
my $elem = $a.mymethod;
say $elem; # n
say $a; # SetHash(m k)
Run Code Online (Sandbox Code Playgroud)

我可以分两步完成,如下所示.有没有更好的办法?

my $elem = $a.pick;
$a{$elem}--;
Run Code Online (Sandbox Code Playgroud)

顺便说一下,是否有更多惯用的方法可以添加几个元素SetHash

以下是否更好?

my SetHash $a;
$a{$_}++ for <m n k>;
Run Code Online (Sandbox Code Playgroud)

要么

my SetHash $a;
$a<m n k> X= True;
Run Code Online (Sandbox Code Playgroud)

rai*_*iph 5

UPD我现在暂时没有删除它,但是请看timotimo的答案.

我想删除一个SetHash的元素,以便返回它的值

使用:delete副词.

根据下标文档页面,:delete副词将从集合中删除元素,或者,如果集合支持,则在给定索引处创建一个洞,除了返回它们的值之外:

my %associative = << :a :b :c >> ;
my $deleted = %associative<< a c >> :delete ;
say $deleted ;     # (True True)
say %associative ; # {b => True}
Run Code Online (Sandbox Code Playgroud)

UPD整合@ piojo和@ EugeneBarsky的评论和答案:

my %associative = << :a :b :c >> ;
my $deleted = .{.keys.pick } :delete :k with %associative ;
say $deleted ;     # b 
say %associative ; # {a => True, c => True}
Run Code Online (Sandbox Code Playgroud)

是否有更多惯用的方法向SetHash添加几个元素?

右侧列表的简单分配有效,例如

$a<m n k> = True, True, True;
$a<m n k> = True xx *;
$a<m n k> = True ... *;
Run Code Online (Sandbox Code Playgroud)

我也使用和看过其他人在你的例子中同时使用这两种配方.


tim*_*imo 5

由于您想从集合中删除任何随机元素并返回获得的值,因此我建议grab在 Setty 事物上使用该方法(仅适用于可变集合,例如SetHash): https: //docs.perl6.org/type/ SetHash#(Setty)_method_grab

根据您需要的确切返回值,grabpairs 可能更好。