我想删除SetHash
的任何元素,以便返回其值:
my SetHash $a;
$a<m n k> = 1..*;
my $elem = $a.mymethod;
say $elem; # n
say $a; # SetHash(m k)
我可以分两步完成,如下所示。还有更好的方法吗?
my $elem = $a.pick;
$a{$elem}--;
顺便说一下,是否有一种更为惯用的方法可以向SetHash
添加多个元素?
以下是否更好?
my SetHash $a;
$a{$_}++ for <m n k>;
或
my SetHash $a;
$a<m n k> X= True;
答案 0 :(得分:5)
UPD 我暂时不回复此答案,而是将其删除,但请参阅timotimo's answer。
我想删除SetHash的一个元素,以便返回其值
使用:delete
副词。
每the Subscript doc page,
:delete
副词将从集合中删除元素,或者如果集合支持,则在给定索引处创建一个洞,除了返回它们的值之外:
my %associative = << :a :b :c >> ;
my $deleted = %associative<< a c >> :delete ;
say $deleted ; # (True True)
say %associative ; # {b => True}
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}
是否有更多惯用的方法可以将多个元素添加到SetHash中?
右侧列表的简单分配有效,例如
$a<m n k> = True, True, True;
$a<m n k> = True xx *;
$a<m n k> = True ... *;
我也使用和看过其他人同时使用你的例子中的两种配方。
答案 1 :(得分:4)
由于你想从集合中删除任何随机元素并返回你得到的值,我建议在Setty上使用grab
方法(仅适用于{{1}等可变集合}):https://docs.perl6.org/type/SetHash#(Setty)_method_grab
根据您需要的确切回报值,也许更好的抓斗。
答案 2 :(得分:3)
如果我正确理解您的注释,您希望从哈希中删除元素而不知道它是否存在,并将该元素作为返回值(如果它存在)。这可以通过合并:delete
和:k
副词来完成。
my %set := SetHash.new: ('a'..'g');
my @removed = %set<a e i o u>:delete :k;
say @removed; # output: [a e]
答案 3 :(得分:1)
删除元素并将其返回的另一种方法是使用自定义方法扩充List
类:
SetHash
<强>输出强>:
use v6;
use MONKEY-TYPING;
augment class SetHash {
method delete-elem(Any $elem) {
self.DELETE-KEY( $elem );
return $elem;
}
}
my SetHash $a = <m n k>.SetHash;
$a<a b c>»++; # add some more elements to the SetHash...
my $elem = $a.delete-elem( $a.pick );
say "Deleted: $elem";
say $a;
答案 4 :(得分:1)
结合使用答案,似乎我设法做了我想要的事情:
my SetHash $s;
$s = <a b c d e f>.SetHash;
my $deleted = $s{ $s.pick } :delete :k;
say $deleted; # f
say $s; # SetHash(a b c d e)