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

Can I delete an element of SetHash and use its value in Perl 6?

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

UPD 我暂时保留这个答案而不是删除它,但请参阅 .

I would like to delete an element of a SetHash, so that its value be returned

使用 :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}

is there a more idiomatic way of adding several elements to a SetHash?

右侧带有列表的简单赋值是可行的,例如

$a<m n k> = True, True, True;
$a<m n k> = True xx *;
$a<m n k> = True ... *;

我已经使用并看到其他人也在您的示例中使用这两种公式。

删除元素并返回它的另一种方法是使用自定义方法扩充 SetHash class:

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;

输出:

Deleted: m
SetHash(a b c k n)

如果我对您的评论理解正确,您想从散列中删除一个元素,而不知道它是否存在,如果该元素存在,则将其作为 return 值获取。这可以通过组合 :delete:k 副词来完成。

my %set := SetHash.new: ('a'..'g');
my @removed = %set<a e i o u>:delete :k;
say @removed; # output: [a e]

使用答案的组合,我似乎已经做到了我想要的:

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)

因为你想从集合中删除任何随机元素和 return 你得到的值,我建议在 Setty 上使用 grab 方法(只适用于可变集合,比如SetHash): https://docs.perl6.org/type/SetHash#(Setty)_method_grab

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