2009-10-05 10 views
13

Dla nieświadomych Perla autobox, jest to moduł, który daje metody wbudowane w prymitywy, i pozwala nawet zastąpić je.Czy powinienem używać autoboxa w Perlu?

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

Ogólnie rzecz biorąc, metody oparte na wbudowanych typach bardziej przypominają obiekty, upraszczają niektóre zadania i sprawiają, że inne wydają się bardziej oczywiste.

Jednak ...

się autobox docs powiedzieć, że istnieje performance penalties, niektóre bardziej niż po prostu wywołanie metody na obiekt, o wiele więcej niż standardowej składni. And then, there's a few caveats about its use in evals (specifically, string evals) that might, in some circumstances, cause issues. Wygląda na to, że nie jest standardem dla wielu dystrybucji Perla.

Czy naprawdę warto korzystać z autobox?

+1

To całkiem fajne! – Geo

+3

To jest całkiem fajne, ale część mnie nie może nic poradzić na rzecz "Gdybym chciał użyć Rubiego ..." –

+3

Rozumiem, dlaczego Java i C# robią autoboxing: Zbiory działają tylko na obiektach przy użyciu określonych metod odziedziczonych z podstawowego obiektu klasa (prawdopodobnie przesłonięta), więc prymitywne typy są zapakowane do ich typów obiektów, zanim zostaną umieszczone w kolekcji. Perl nie ma czegoś takiego, więc po co prostuje pudełka w obiektach? – Powerlord

Odpowiedz

10

Cóż, czy kiedykolwiek chciałeś mieć moduł, który zrobił to, co zrobił autobox, zanim dowiedziałeś się o autobox?

Jeśli odpowiedź brzmi "tak", należy jej użyć. Możesz również przyczynić się do jego rozwoju, zgłaszając zgłoszenia błędów i je naprawiając, jeśli masz taką możliwość.

Niestety, wpadam do obozu "fajnie, ale ...", więc nie mogę zaoferować ci więcej wglądu.

+3

Uzgodnione. Jest całkiem fajny, a niektóre z tych funkcji wyglądają zgrabnie (część "sub {...} -> curry()" wygląda interesująco), ale chciałbym zobaczyć trochę dokumentacji i kilka funkcji, a nie tylko zdolność do autobox literały. Wygląda jak fajna zabawka, a nie potężne narzędzie. To może się zmienić w przyszłości, ale jeśli się zmieni, będzie to oznaczało utrwalenie API. –

6

Konie na kursy! Jednak czytając łańcuch od lewej do prawej jest często łatwiejsze do grok IMHO:

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

Chociaż krótsze poniżej płynie ładniejszy:

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

ref: snippet from Hacker News comments

/I3az/

+0

Nie sądzę, że anonimowy podprogram w 'map {chr} 0 ..255' jest konieczne - możesz zrobić 'map chr, 0 .. 255' (oczywiście, możesz polubić to lepiej w pierwszy sposób, co jest całkowicie poprawne). Nie wiem, czy można to zrobić za pomocą metod autobox. Jeśli nie możesz tego teraz zrobić, powinien to być raport o błędzie. –

+0

Dwie linie pochodzą z komentarzy Hacker News, które właśnie wkleiłem (chociaż wersja autobox była moim komentarzem!) – draegtun

+3

re: autobox/raport o błędzie: To nie jest błąd, ponieważ musi to być blok (np. w przeciwnym razie wyrażenie zostanie ocenione w niewłaściwym miejscu ;-(Być może pewnego dnia PerlX :: MethodCallWithBlock zrobi potrzebny cukier ...-> map() {chr} -> grep() {m/w /} -> sort ... być może? Być może nawet nawiasy można upuścić! – draegtun

5

Używam autoboxu dla:

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

To kończy się jako arbitralny hasz i redukuje go do { username => <whatever>, password => <whatever> }. Zwykle dużo kodu. Jeden symbol z Moose :: Autobox.

+0

Istnieje rozróżnienie między hslice, która jest przyjemną funkcją, a głównym celem autoboxa, który zapewnia klej do wywoływania go w ten sposób.Co byłoby nie tak z $ c-> login (hslice ($ c-> req -> {params}, [qw/nazwa_użytkownika hasło /])? – ijw

+0

Czy to nie to samo co '$ c-> login (map {$ _ => $ c-> req-> {params} -> {$ _}} qw/nazwa_użytkownika hasło /); '? –

+0

Tak, ale punkt Jonathana jest ważny: funkcja, której używa, jest z pewnością dokładniejszym kodem to. – ijw

Powiązane problemy