我应该在Perl中使用autobox吗?

时间:2009-10-05 18:11:15

标签: perl

对于那些不了解Perl的autobox的人来说,它是一个模块,可以为你提供内置基元的方法,甚至可以覆盖它们。

# primitives
'a string'->toupper();
10->to(1); # returns [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

# Arrays, array refs
[qw(A B C D E)]->for_each( sub { ... } );
@array->length()

# Hashes, hash refs
{ key => 'value', key2 => 'value2' }->values()
%hash->keys()

# Even specify your own base class...
use autobox SCALAR => 'Foo';

整体而言,内置类型的方法更像是对象,简化了某些任务,使其他任务变得更加明显。

...然而

autobox文档说有performance penalties,不仅仅是简单地调用对象上的方法,而不是标准语法。 And then, there's a few caveats about its use in evals (specifically, string evals) that might, in some circumstances, cause issues.它似乎也不是许多Perl发行版的标准。

使用autobox真的值得吗?

3 个答案:

答案 0 :(得分:10)

那么,您是否曾希望在发现autobox之前有一个模块执行了autobox所做的事情?

如果答案为“是”,那么您应该使用它。您可能还希望通过提交错误报告并在获得机会时修复它们来为其开发做出贡献。

不幸的是,我陷入了'酷,但是......'的阵营,所以我无法为你提供更多的见解。

答案 1 :(得分:6)

马匹课程!然而,从左到右阅读链条通常更容易理解恕我直言:

say sort grep /\w/, map { chr } 0 .. 255;

虽然下面的短路确实更好:

say [ 0..255 ]->map( sub { chr } )->grep( sub { m/\w/ } )->sort->join(''); 

参考:snippet from Hacker News comments

/ I3az /

答案 2 :(得分:5)

我使用autobox:

$c->login($c->req->{params}->hslice([qw/username password/])

这最终会采用任意哈希并将其缩减为{ username => <whatever>, password => <whatever> }。通常很多代码。 Moose :: Autobox的一个符号。