큰 배열 @stuff
및 $thing
을 가지고 있고 $thing
이 @stuff
에 있는지 알고 싶다고 가정 해 봅시다. Perl 6에서 그렇게하는 가장 좋은 방법은 무엇입니까? 그리고 "최고"라는 뜻은 : 관용적이며, 읽기 쉽고, 공연하는 사람입니다. 꼭 그런 순서는 아닙니다.Perl 6 : 요소가 목록에 있는지 확인하는 가장 좋은 방법은 무엇입니까?
실제로 두 개의 개별적인 경우가 있습니다. 하나는 다른 $thing
에 대한 많은 검사를해야하는 곳이고 다른 하나는 한 번 또는 몇 번만 수행하는 곳입니다.
먼저 첫 번째 사례를 살펴 보겠습니다. 나는 (또는) 옳은 대답을 안다고 생각한다.
my $set-of-stuff = set @stuff;
for @whatever -> $thing {
do-something-with($thing) if $thing ∈ $set of stuff;
}
당신은 실제로 첫 번째 줄을 건너 뛰고 ... if $thing ∈ @stuff
말을하지만, 세트마다 생성되기 때문에 그것은 거의 확실하게, 훨씬 더 성능을해야합니다 수 있습니다.
하지만 이제 두 번째 경우에만 확인하려면 $thing
이 하나 있습니다. 위의 해결 방법은 물론 작동하지만 세트를 만들면 한 번만 확인하면 많은 오버 헤드가 발생합니다. 우리는 한 번만 호출 이후 바로 가기
do-something-with($thing) if $thing ∈ @stuff;
, 여기에 조금 더 의미가 있습니다. 그러나 여전히, 우리는 하나의 용도로 세트를 만들어야합니다. 잠재적으로 더 빠른
do-something-with($thing) if @stuff.grep($thing);
또는 :
do-something-with($thing) if @stuff.first($thing);
하지만이 덜 관용적 것, 그리고 확실히 두 번째는 $thing ∈ @stuff
이하 읽을 수
좀 더 전통적인이다.
저는 스마트 매치 솔루션이 있다고 생각하지 않습니다. 맞습니까? 물론이 작동하지 않습니다 :
do-something-with($thing) if $thing ~~ @stuff;
어떤 생각?
감사합니다. 나는 '모든 것'에 대해 생각해 보았습니다.그러나, 나의 경험에서, 현재의 Rakudo 버전에있는 접속점은 매우 느리다. 그래서 그것은 아마 좋은 옵션 (아직)이 아니다. – mscha
그리고 "최고"무엇입니까? 음, 상황에 따라 달라질 것 같습니다. 이상적으로는 최고의 성능, 숙어 (sic?) 및 가독성. 그러나 실제로는 타협해야합니다. 예를 들어 가독성을 위해 일부 성능을 희생시킬 수는 있지만 많지는 않습니다. – mscha
실제로'[email protected] ($ thing)'은'@ stuff.first ($ thing)'만큼 빠르다. (일치하는 것을 찾은 후에 멈추기 때문에) –