2017-11-30 20 views
3
나는 그것의 값이 반환 될 수 있도록하는 SetHash의 모든 요소를 ​​삭제하려면

다음과 같이SetHash의 요소를 삭제하고 Perl 6에서 해당 값을 사용할 수 있습니까?

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; 

답변

4

당신이 세트에서 어떤 임의의 요소를 제거하고 값을 반환 할 때문에 너는있어, Setty 것들에 grab 방법을 사용하는 것이 좋습니다 (SetHash과 같은 변경 가능 세트에서만 올바르게 작동합니다) : https://docs.perl6.org/type/SetHash#(Setty)_method_grab

필요한 정확한 반환 값에 따라, mayb e grabpairs가 더 좋습니다.

+0

오, 마침내! 그게 바로 내가 원했던 것이고, 나는 이상하게도 문서에서 그것을 놓쳤다. 고맙습니다! –

5

UPD 나는이 지금은 오히려 그것을 삭제하는 것보다 위해 대답하지만, timotimo's answer를 참조 떠날거야.

나는 그것의 값이

사용에게 :delete 부사를 반환 할 수 있도록하는 SetHash의 요소를 삭제하고 싶습니다. :delete 부사 그들의 값 (들)을 리턴 이외에 컬렉션에서 요소 (들)를 삭제하거나, 수집 지원하는 경우, 지정된 인덱스 (들)에 구멍을 만드는 것이다 the Subscript doc page

:

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에 여러 요소를 추가하는 관용적 인 방법이 있습니까?

오른쪽 목록에있는 일반 작업 (예 :

예를 들어 두 가지 공식을 모두 사용해 보았습니다.

+0

아마도 제 질문은 분명하지 않습니다. 문제는 내가 삭제하고 싶은 요소를 미리 알지 못해서 'True'가 아닌 값 (예 :''c '')을 갖고 싶다는 것입니다. 그래서 저는'팝 (pop) '과 같은 것을하고 싶습니다. –

+1

': delete'는 일반적인'pop'과 같습니다. 네가 무슨 문제가 있다고 생각하는지 모르겠다. 예를 들어, 요소는 동적으로 선택 될 수 있습니다. '% myhash <<@elems>> : 삭제 ' – raiph

+0

@EugeneBarsky 요소의 목록을 삭제하지 않고 요소 목록을 삭제하고 나중에 반환 값으로 이전에 요소의 일부였던 요소를 말하고 싶습니까? – piojo

1

요소를 삭제하고 반환하는 또 다른 방법은, 사용자 정의 방식으로 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; 

출력 :

Deleted: m 
SetHash(a b c k n) 
+1

안녕하세요. 나는 당신의 솔루션이': delete' 부울 (내 대답 당)에 내장 된 것에 의해 달성되지 않는 것을 어떻게 달성하는지 보지 않습니다. Eugene은 내가 뭔가를 놓치고 있다고 말하는 것 같지만 물론 나는 내가 보지 않고있는 것을 보지 않고있다. :) – raiph

3

내가 제대로 귀하의 의견을 이해한다면, 존재 여부를 알지 못하고 해시에서 요소를 삭제하고 요소가 있으면 반환 값으로 가져 오려고합니다. 이는 :delete:k의 부사를 ​​결합하여 수행 할 수 있습니다.

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

고마워, 나는 답을 많이 읽는 법을 배웠다! 내가 원했던 것은'SetHash'의 모든 요소를 ​​반환 값으로 가져 와서'SetHash'에서 그것을 삭제하는 것이 었습니다. :)'pop'에 임의의 원소를 넣는 것 ('Set'에 순서가 없기 때문에). –

+0

@EugeneBarsky 오, 마침내 당신이 의미하는 바를 이해합니다. 하나의 작업으로 그렇게 할 수는 없습니다. 일반적인 일이 아니기 때문입니다. 집합에서 임의의 원소를 제거해야하는 알고리즘은 많지 않습니다. 집합에서 요소를 제거해야하는 경우 한 번 또는 점진적 임의 화를 허용하므로 배열을 더 나은 데이터 구조로 발견했습니다. 그럼에도 불구하고, 그것은 유효한 필요성이지만'Array.pop'와 같은 리그에 있지 않습니다. – piojo

+0

감사! 따라서 pick을 사용하여 메서드를 사용하겠습니다. 나는 나의 질문이 매우 형편없이 공식화되었다고 느낀다. 그럼에도 불구하고 나는 대답에서 많은 것을 배웠다. –

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)