2011-06-16 29 views
8

Tôi vừa mới bắt đầu làm việc với Moose và đã gặp phải một vấn đề kỳ lạ mà tôi không thể hiểu được. Các mã sau đây:Hành vi kỳ quặc với Moose, Thử :: Tiny, và TryCatch

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Try::Tiny; 

{ 
    package Foo; 
    use Moose; 
    has x => (is => 'ro', isa => 'Int'); 
} 

my $f; 
try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
} 
print $f->x . "\n"; 

sản xuất:

Can't call method "x" on an undefined value at m2.pl line 19. 

Tuy nhiên, nếu tôi thay Try::Tiny với TryCatch, nó đóng vai trò như tôi sẽ giả định nó nên:

oops 

Thậm chí nếu x là giá trị chính xác, giả sử 5, Try::Tiny vẫn sản xuất lỗi undefined value.

Vì tất cả tài liệu Moose tôi đã đọc đều sử dụng Try::Tiny, tôi rất bối rối vì sao mã này không hoạt động. Tôi đang làm điều gì đó hoàn toàn sai ở đây?

Trả lời

16

Try::Tiny đòi hỏi một dấu chấm phẩy ở cuối bài kệ try/catch:

try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
}; 

Điều này là do việc thực hiện Try::Tiny - trycatch đều chỉ chức năng.

+0

Gah, một cái nhìn lúng túng. Cảm ơn! – Joe

+2

+1 Để sử dụng tuyệt vời * stanza *. – FMc

4

try {...} catch {...} không phải là nội trang dựng sẵn (vì nó được cung cấp bởi một mô-đun). Trong perl 5 này có nghĩa là bạn phải kết thúc nó bằng dấu chấm phẩy như vậy:

try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
}; 
print $f->x . "\n"; 

tôi không thể trả lời như thế nào TryCatch quản lý để xử lý các dấu chấm phẩy thiếu - nhưng nó có thể sử dụng nhiều ma thuật đen :)

+8

TryCatch sử dụng Devel :: Khai báo để sửa đổi trình phân tích cú pháp. Nó có hiệu quả tạo ra các quy tắc phân tích cú pháp mới cho khối try/catch thay vì phụ thuộc vào việc sử dụng sáng tạo các nguyên mẫu và các trình ẩn danh ẩn danh. – perigrin

+1

Devel :: Declare có một số tranh cãi liên quan đến nó liên quan đến vấn đề "quá nhiều phép thuật": http://www.perlmonks.org/?node_id=832796 – daotoad

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