2011-09-26 26 views
9

Tôi có một tham chiếu đối tượng và nó có thể là một tham chiếu đến một đối tượng kiểu 'FooInvalidResults'Bắt classname của một đối tượng trong Perl

Có một tập tin gọi là FooInvalidResults.pm và có một dòng 'gói FooInvalidResults' trong đó.

sẽ làm việc sau đây?

my $class = blessed $result; 
if ($class eq 'FooInvalidResults') { 
    # do something 
} else { 
    # do something else 
} 

Trả lời

1

Tại sao bạn không sử dụng UNIVERSAL::isa?

if UNIVERSAL::isa($result, "FooInvalidResults") { 
    ... 
} 

Đây là lời khuyên xấu, hãy sử dụng

$obj->isa('FooInvalidResults'); 

Tôi đã không đầy đủ nhận thức được sự khác biệt giữa gọi chương trình con (BAD) và gọi phương thức (TỐT), nhưng nó trở nên rõ ràng sau Tôi đã làm một số RTFM bản thân mình (perldoc UNIVERSAL). Cảm ơn (và +1) cho tất cả mọi người đã chỉ ra lỗi của tôi.

+1

Vui lòng không khuyên bất kỳ ai sử dụng UNIVERSAL :: ISA! Nếu ai đó biết, khi nó nguy hiểm để sử dụng, anh ta sẽ không hỏi ... –

+1

@JanHartung Roger điều đó. Tôi không biết rằng 'UNIVERSAL :: isa' là một nhịp tim như vậy. Có lẽ tôi đã không lạm dụng 'isa' đủ để gặp rắc rối. –

+0

$ obj-> isa không hoạt động khi tôi muốn đảm bảo một đối tượng là thành viên của lớp cha và không phải là thành viên của một số lớp con. –

15

Các tên lớp so sánh chuỗi thường là một ý tưởng tồi, vì nó phá vỡ đa hình dựa trên các kiểu con, và vì thực tế không phải là thực hành tốt của OO để biết chi tiết thân mật của một đối tượng như tên gói chính xác của nó.

Thay vào đó, hãy viết $result->isa('FooInvalidResults') - hoặc nếu bạn hoang tưởng về khả năng $result không phải là một đối tượng nào cả, blessed $result && $result->isa('FooInvalidResults').

Sử dụng UNIVERSAL::isa là một ý tưởng tồi vì một số đối tượng (ví dụ, đối tượng giả để thử nghiệm) có lý do chính đáng để ghi đè phương pháp isa và gọi số UNIVERSAL::isa.

+0

Theo ý kiến ​​của bạn, 'UNIVERSAL :: isa' luôn là một ý tưởng tồi, hoặc nó có thể là một giải pháp khả thi cho những trường hợp đơn giản? –

+0

@MarcoDeLellis nếu có trường hợp sử dụng, chắc chắn không phải là * đơn giản *. Nó có thể có ý nghĩa khi viết một mro tùy chỉnh hoặc một cái gì đó, nhưng nó không bao giờ nên được sử dụng cho các mục đích thông thường. – hobbs

0

Nó cũng có thể thực hiện công việc với ref() BUILTIN hơn Scalar::Util::blessed():

$ perl -E '$ref = {}; bless $ref => "Foo"; say ref $ref' 
Foo 

Lưu ý rằng nếu tham chiếu không được thiên nhiên ưu đãi, điều này sẽ trở lại với loại tài liệu tham khảo:

$ perl -E '$ref = {}; say ref $ref' 
HASH 

Tuy nhiên, như những người khác đã đề cập, UNIVERSAL::isa là một giải pháp tốt hơn.

+1

Xin vui lòng không tư vấn cho bất cứ ai sử dụng UNIVERSAL :: ISA! Nếu ai đó biết, khi nó nguy hiểm để sử dụng, anh ta sẽ không hỏi ... –

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