2009-10-05 22 views
13

Para aquellos que desconocen el autobox de Perl, es un módulo que le proporciona métodos sobre primitivas incorporadas, y le permite incluso anularlas.¿Debo usar autobox en Perl?

# 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'; 

Se global hace que los métodos de construcción de tipos sentirse más como objetos, lo que simplifica algunas tareas y hacer que otros parecen más evidentes.

Sin embargo ...

los autobox documentos dicen que hay performance penalties, algunos más que simplemente llamando al método en el objeto, mucho más que la sintaxis estándar. And then, there's a few caveats about its use in evals (specifically, string evals) that might, in some circumstances, cause issues. También parece que no viene de serie con muchas distribuciones de Perl.

¿Realmente vale la pena usar autobox?

+1

¡Eso es genial! – Geo

+3

Es genial, pero una parte de mí no puede dejar de pensar en "Si quisiera usar Ruby ..." –

+3

Entiendo por qué Java y C# hacen autoboxing: Las colecciones solo operan en objetos utilizando métodos específicos heredados de la base Object clase (posiblemente anulada), por lo que los tipos primitivos se agrupan en sus tipos de objetos antes de rellenarlos en una colección. Perl no tiene nada como esto, entonces ¿por qué primitivas de caja en objetos? – Powerlord

Respuesta

10

Bueno, ¿alguna vez deseó que hubiera un módulo que hiciera lo que hace autobox antes de averiguar autobox?

Si la respuesta es 'sí', entonces debe usarla. También puede contribuir a su desarrollo presentando informes de fallas y corrigiéndolos si tiene la oportunidad.

Lamentablemente, caigo en el campamento de 'genial, pero ...' por lo que no puedo ofrecerle más información.

+3

De acuerdo. Es muy bueno, y algunas de esas funciones se ven bien (la parte 'sub {...} -> curry()' parece interesante), pero me gustaría ver algo de documentación y algunas funciones, en lugar de simplemente la capacidad de literales autobox. Parece un juguete genial, no una herramienta poderosa. Eso puede cambiar en el futuro, pero si cambia será al solidificar la API. –

6

¡Caballos para cursos! Sin embargo la lectura de una cadena de izquierda a derecha es a menudo más fácil de asimilar en mi humilde opinión:

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

Mientras más corto a continuación fluye el más bonito:

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

ref: snippet from Hacker News comments

/I3az/

+0

No creo que la subrutina anónima en 'map {chr} 0 ..255 'es necesario - puedes hacer 'map chr, 0 .. 255' (por supuesto, puede que te guste más la primera manera, lo cual es perfectamente válido). Sin embargo, no sé si puedes hacer eso con los métodos de autobox. Si no puede hacerlo ahora, debería ser un informe de error. –

+0

Las dos líneas provienen de los comentarios de Hacker News que acabo de pegar (¡aunque la versión del autobox fue mi comentario!) – draegtun

+3

re: informe autobox/error: No es un error porque debe ser un bloque (es decir, anon sub) porque de lo contrario, la expresión se evaluaría en el lugar equivocado ;-(Quizás un día PerlX :: MethodCallWithBlock haga el azúcar necesario ...-> map() {chr} -> grep() {m/w /} -> sort ... tal vez ... ¡incluso se pueden descartar paréntesis! – draegtun

5

Yo uso autobox para:

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

Esto termina tomando un hash arbitrario y lo reduce a { username => <whatever>, password => <whatever> }. Normalmente un montón de código. Un símbolo con Moose :: Autobox.

+0

Hay una distinción entre hslice, que es una función agradable, y el propósito principal del autobox que proporciona el pegamento para llamarlo de esa manera. ¿Qué podría pasar con $ c-> login (hslice ($ c-> req -> {params}, [qw/nombre de usuario contraseña /])? – ijw

+0

¿No es lo mismo que '$ c-> inicio de sesión (mapa {$ _ => $ c-> req-> {params} -> {$ _}} qw/nombre de usuario password /); '? –

+0

Sí. Pero el punto de vista de Jonathan es que la función que está usando es sin duda un eso. – ijw