我应该在Perl中使用autobox吗?

Rob*_*t P 13 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';
Run Code Online (Sandbox Code Playgroud)

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

然而...

autobox文档说有性能损失,一些比简单地调用对象的方法,比标准的语法更加多. 然后,有一些关于它在evals中使用的警告(特别是字符串evals)在某些情况下可能会导致问题. 它看起来似乎没有标准的许多Perl发行版.

使用autobox真的值得吗?

Sin*_*nür 10

好吧,你有没有希望在你发现autobox之前有一个模块可以做autobox呢?

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

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

  • 同意.它非常酷,其中一些函数看起来很整洁(`sub {...} - > curry()`部分看起来很有趣),但我想看一些文档和一些函数,而不仅仅是能够autobox文字.它看起来像一个很酷的玩具,而不是一个强大的工具.这可能会在未来发生变化,但如果它发生变化,则可以通过巩固API来实现. (3认同)

dra*_*tun 6

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

say sort grep /\w/, map { chr } 0 .. 255;
Run Code Online (Sandbox Code Playgroud)

虽然较短的下方确实更好地流动:

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

来自Hacker News评论的参考:片段

/ I3az /

  • re:autobox/bug报告:它不是一个bug,因为它需要是一个块(即anon sub),否则表达式将在错误的地方进行评估;-(或许有一天PerlX :: MethodCallWithBlock会产生必要的糖...-> map(){chr} - > grep(){m/w /} - > sort ...也许?甚至可以删除括号! (3认同)

jro*_*way 5

我使用autobox:

$c->login($c->req->{params}->hslice([qw/username password/])
Run Code Online (Sandbox Code Playgroud)

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