2013-08-14 34 views
5

Moje pierwsze pytanie na tej stronie, przychodzę szybko. Jestem programistą, używam głównie Pythona i Perla. Jestem pasjonatem i bardzo lubię ten rozwój.Jak korzystać z typów :: Ścieżka :: Tiny with Moo

Moje pierwsze pytanie dotyczy Perla, Moo i Type :: Tiny. Typ :: Tiny to świetny moduł do użytku z Moo, ale powrócę do tego tematu w innym pytaniu.

Odkryłem Types :: Path :: Tiny moduł wymuszający dla Moose i Moo, więc próbowałem utworzyć katalog atrybutów w mojej klasie, jak to opisano w documentation, ponieważ mój projekt był w Moose, ale działa, przeniosłem w Moo, to już nie działa:

package MahewinBlogEngine::Common; 

use strict; 
use warnings; 

use feature "state"; 

use Moo; 
use Types::Path::Tiny qw/Path AbsPath/; 

use CHI; 
use MahewinBlogEngine::Renderer; 

use Type::Params qw(compile); 
use Types::Standard qw(slurpy Object Str HashRef ArrayRef); 


=attr directory 

rw, required, Str. The directory contain articles. 

=cut 

has 'directory' => (
    is  => 'rw', 
    isa  => AbsPath, 
    required => 1, 
    coerce => 1, 
); 

w moim katalogu badań:

my $articles = MahewinBlogEngine->articles(directory => getcwd() . '/t/articles'); 

błędu jest:

Invalid coerce '1' for MahewinBlogEngine::Common->directory not a coderef or code-convertible object at /home/hobbestigrou/perl5/perlbrew/perls/perl-5.19.1/lib/site_perl/5.19.1/Method/Generate/Accessor.pm line 618. 
Compilation failed in require at /home/hobbestigrou/perl5/perlbrew/perls/perl-5.19.1/lib/site_perl/5.19.1/Module/Runtime.pm line 317. 
Compilation failed in require at /home/hobbestigrou/MahewinBlogEngine/lib/MahewinBlogEngine.pm line 8. 
BEGIN failed--compilation aborted at /home/hobbestigrou/MahewinBlogEngine/lib/MahewinBlogEngine.pm line 8. 
Compilation failed in require at ./benchmark.pl line 10. 
BEGIN failed--compilation aborted at ./benchmark.pl line 10. 

Jest to normalne, ponieważ z Moo przymus jest coderef więc próbowałem:

has 'directory' => (
    is  => 'rw', 
    isa  => AbsPath, 
    required => 1, 
    coerce => sub { return "Path" } 
); 

Błąd jest:

value "Path" did not pass type constraint "Path" (not isa Path::Tiny) (in $self->{"directory"}) at (eval 355) line 99. 

Jeśli mam żadnego zmuszania:

value "/home/hobbestigrou/MahewinBlogEngine/t/articles" did not pass type constraint "Path" (not isa Path::Tiny) (in $self->{"directory"}) at (eval 355) line 89. 

I Przepraszam za to proste pytanie, muszę być głupi i coś przegapić, ale nie widzę, co może mi brakowało coś w dokumencie.

Dzięki

+1

Czy katalog musi być 'Ścieżka :: przedmiot Tiny'? ... 'coerce => sub {return Path :: Tiny-> new ($ _ [0])}'? – mob

+0

Dzięki to działa świetnie. – Hobbestigrou

Odpowiedz

6

Nie ma powodu, aby mieć use strict; i use warnings; jeśli masz use Moo; jak robi to za Ciebie.

Należy również podać Moo kod referencji dla elementu coerce, a nie prawdziwą wartość.
Sposób uzyskiwania tego z Type::Tiny polega na wywołaniu $type->coercion.

package MahewinBlogEngine::Common; 

# not needed with Moo 
# use strict; 
# use warnings; 

use Moo; 
use Types::Path::Tiny qw/AbsPath/; 

... 

has 'directory' => (
    is  => 'rw', 
    isa  => AbsPath, 
    required => 1, 
    coerce => AbsPath->coercion, 
); 
for(qw'/home ./ ./Documents Documents'){ 
    use feature 'say'; 
    say $_, "\t", MahewinBlogEngine::Common->new(directory => $_)->directory; 
} 
/home /home 
./  /home/user 
./Documents  /home/user/Documents 
Documents  /home/user/Documents 
+1

Cześć, masz rację, nie ma potrzeby stosowania rygorystycznych i ostrzeżeń z Moo, dzięki czemu jest fajnie. – Hobbestigrou

+0

Mimo to możesz chcieć użyć modułu [zwężenia] (https://metacpan.org/pod/strictures). Od [Moo] (https://metacpan.org/pod/Moo#INCOMPATIBILITIES-WITH-MOOSE) POD: _ "Postępowanie z ostrzeżeniami: podczas korzystania z Moo włączamy rygorystyczne i ostrzegawcze, w podobny sposób jak Moose Autorzy zalecają stosowanie "zwężeń", które umożliwiają ostrzeżenia FATAL i kilka dodatkowych pragm, gdy są stosowane w rozwoju: [pośrednie] (https://metacpan.org/pod/indirect), [wielowymiarowe] (https: // metacpan.org/pod/multidimensional) i [bareword :: filehandles] (https://metacpan.org/pod/bareword:: filehandles). _ –

+0

@JayAllen Moo używane do włączania więzów, ale okazało się, że zbyt problematyczne dla modułów CPAN, jeśli do perla dodano jakieś ostrzeżenia. –