2013-08-14 26 views
5

Câu hỏi đầu tiên của tôi trên trang này, tôi đến nhanh chóng. Tôi là một nhà phát triển, tôi chủ yếu sử dụng Python và Perl. Tôi đam mê và tôi thực sự thích sự phát triển.Cách sử dụng Loại :: Đường dẫn :: Nhỏ với Moo

Câu hỏi đầu tiên của tôi là về Perl, Moo và Type :: Tiny. Loại :: Tiny là một mô-đun tuyệt vời để sử dụng với Moo tất nhiên, nhưng tôi sẽ quay trở lại chủ đề này trong một câu hỏi khác.

Tôi đã phát hiện ra các loại :: Đường dẫn :: Tiny một mô-đun cưỡng chế cho Moose và Moo, vì vậy tôi đã cố gắng tạo một thư mục thuộc tính trong lớp như mô tả trong documentation, khi dự án của tôi ở Moose nó hoạt động. tôi di chuyển trong Moo, nó không còn hoạt động:

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, 
); 

trong các thử nghiệm thư mục của tôi:

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

Lỗi là:

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. 

này là bình thường, bởi vì với Moo việc cưỡng chế là một coderef vì vậy tôi cố gắng:

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

Lỗi là:

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

Nếu tôi không có ép buộc:

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

tôi m xin lỗi cho câu hỏi đơn giản này, tôi phải ngu ngốc và bỏ lỡ một cái gì đó, nhưng tôi không thấy những gì có lẽ tôi đã thiếu một cái gì đó trong doc.

Cảm ơn

+1

Có thư mục cần phải là một 'con đường :: đối tượng Tiny'? ... 'coerce => sub {return Đường dẫn :: Tiny-> new ($ _ [0])}'? – mob

+0

Cảm ơn nó hoạt động tuyệt vời. – Hobbestigrou

Trả lời

6

Không có lý do gì để có use strict;use warnings; nếu bạn có use Moo; vì nó làm điều đó cho bạn.

Bạn cũng phải cung cấp cho Moo tham chiếu mã cho phần tử coerce, không phải là giá trị thực.
Cách bạn nhận được điều đó với Type::Tiny bằng cách gọi số $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

Xin chào, bạn đúng không cần sử dụng pragma nghiêm ngặt và cảnh báo với Moo, cảm ơn nó thật tuyệt. – Hobbestigrou

+0

Tuy nhiên, bạn có thể muốn sử dụng mô-đun [strictmet] (https://metacpan.org/pod/strictures). Từ [Moo] (https://metacpan.org/pod/Moo#INCOMPATIBILITIES-WITH-MOOSE) POD: _ "Xử lý cảnh báo: khi bạn sử dụng Moo, chúng tôi cho phép nghiêm ngặt và cảnh báo, theo cách tương tự như Moose Các tác giả đề nghị sử dụng 'strictures', cho phép cảnh báo FATAL, và một số pragma phụ khi được sử dụng trong phát triển: [gián tiếp] (https://metacpan.org/pod/indirect), [multidimensional] (https: // metacpan.org/pod/multidimensional) và [bareword :: filehandles] (https://metacpan.org/pod/bareword::filehandles). "_ –

+0

@JayAllen Moo đã sử dụng để cho phép các mức độ nghiêm ngặt, nhưng điều đó được phát hiện là quá có vấn đề đối với các mô-đun CPAN nếu có bất kỳ cảnh báo nào được thêm vào perl. –

Các vấn đề liên quan