Perl 6:检查元素是否在列表中的最佳方法是什么?

时间:2017-01-20 12:14:06

标签: perl6

假设我有一个大数组,@stuff$thing,我想知道$thing是否在@stuff中。 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;

有什么想法吗?

1 个答案:

答案 0 :(得分:11)

取决于您对“最佳”或“智能”的定义。

如果你在谈论表现,我很确定

@stuff.first($thing)

是最快的。

惯用,并且接近上述解决方案,将是:

$thing ~~ any @stuff

由于自动穿线而具有更好的挂钟性能。

使用sets来执行此操作,使代码看起来更接近形式逻辑。但它不会让事情变得更快,因为需要创建集合(除非它可能在编译时创建)。

不确定这个答案是否“最好”。