我可以删除 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 可能更好。
我想删除 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 可能更好。