当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Perl6:检查元素是否在列表中的最佳方法是什么?》经验,为你挑选了1个好方法。

假设我有一个大数组,@stuff和a $thing,我想知道是否$thing@stuff.Perl 6中最好的方法是什么?而"最好"的意思是:惯用,可读,高效; 不一定按顺序排列.

实际上有两个独立的案例.一个是你必须为不同的$things 做很多检查的地方,另一个是你只做一次或几次的地方.

让我们先来看第一个案例.我想我知道(或者)正确答案.

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> Elizabeth Ma..:

取决于您对"最佳"或"智能"的定义.

如果你在谈论性能,我很确定

@stuff.first($thing)

是最快的.

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

$thing ~~ any @stuff

由于自动穿线,它具有更好的挂钟性能.

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

不确定这个问题的答案是"最好的".

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有