我应该在Perl中使用autobox吗?

问题描述:

对于那些不了解Perl的autobox的人来说,它是一个模块,它为您提供内置原语的方法,甚至可以覆盖它们。我应该在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,有些不是简单地调用对象的方法,比标准的语法更加多。它看起来似乎并不符合许多Perl发行版的标准。

是否真的值得使用autobox?

+1

这很酷! – Geo 2009-10-05 18:20:07

+3

这很酷,但我的一部分不能帮助,但事情“如果我想使用Ruby ...” – 2009-10-05 18:26:22

+3

我明白为什么Java和C#做自动装箱:集合只能使用从基础对象继承的特定方法类(可能被重写),所以原始类型在塞入集合之前被装箱到它们的对象类型。 Perl没有这样的东西,所以为什么在对象中加入基元? – Powerlord 2009-10-05 18:54:21

那么,你有没有希望有一个模块做了什么autobox之前,你发现了约autobox呢?

如果答案是'是',那么你应该使用它。您也可能希望通过提交错误报告并在有机会的情况下修复错误报告来为其发展做出贡献。

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

+3

同意。这很酷,其中一些函数看起来很整洁('sub {...} - > curry()'部分看起来很有趣),但我希望看到一些文档和一些函数,而不仅仅是能够autobox文字。它看起来像一个很酷的玩具,不是一个强大的工具。这可能会在未来发生变化,但如果它发生变化,它将通过巩固API。 – 2009-10-05 18:48:11

马的课程!然而读取链从左至右往往更容易神交IMHO:

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

而较短的下面不流动更好:

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

REF:snippet from Hacker News comments

/I3az/

+0

我不认为'map {chr} 0中的匿名子例程..255'是必要的 - 你可以做'map chr,0..255'(当然,你可能更喜欢第一种方式,这是完全有效的)。不过,我不知道你是否可以用自动包装的方法做到这一点。如果你现在无法做到,那应该是一个错误报告。 – 2009-10-05 18:50:50

+0

这两行来自黑客新闻评论,我刚刚粘贴(虽然autobox版本是我的意见!) – draegtun 2009-10-05 18:52:02

+3

回复:autobox/bug报告:它不是一个错误,因为它需要是一个块(即。anon子),因为否则表达式将在错误的地方进行评估;-(也许有一天PerlX :: MethodCallWithBlock将会生成必要的糖...-> map(){chr} - > grep(){m/w /} - > sort ......也许吧?或许甚至括号也可以被丢弃! – draegtun 2009-10-05 22:23:56

我使用autobox:

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

这最终采取任意散列并将其减少到{ username => <whatever>, password => <whatever> }。通常有很多代码。与Moose :: Autobox的一个符号。

+0

hslice是一个很好的函数,autobox的主要目的是提供胶水来调用它,这有一个区别。$ c-> login( hslice($ c-> req - > {params},[qw/username password /])? – ijw 2009-10-06 08:30:35

+0

与$ c-> login不一样(map {$ _ => $ c-> req-> {params} - > {$ _}} qw/username password /);'? – 2009-10-06 16:26:10

+0

是的,但是Jonathan的观点是:他使用的函数肯定是整数代码th一个。 – ijw 2009-10-06 21:03:19