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

时间:2017-11-30 13:01:45

标签: perl6

我想删除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;

5 个答案:

答案 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)